java吧 关注:1,262,353贴子:12,760,270
  • 18回复贴,共1

【超级小白求助】如何用顺序存储、非递归、用栈,做二叉树的遍历

只看楼主收藏回复

1.顺序存储和链式存储的区别?
(一个是数组,一个是指针)但是代码的区别在哪里?
2.递归与非递归如何用栈实现转换?
3.遍历中也是要用顺序存储来做的吗?


1楼2013-12-31 10:26回复
    不明觉厉


    IP属地:湖南2楼2013-12-31 10:27
    收起回复
      2025-06-03 02:33:59
      广告
      不厉觉明


      IP属地:广西3楼2013-12-31 10:32
      收起回复
        前序遍历的例子
        伪代码
        stack.push(0);
        while(!stack.isEmpty()){
        n = stack.pop();
        do something to list[n];
        if (list[2 * n + 2] != null) stack.push(2 * n + 2);
        if (list[2 * n + 1] != null) stack.push(2 * n + 1);
        }


        IP属地:广西4楼2013-12-31 11:00
        回复
          1,顺序就是连续存储,内存中位置是相连的,也叫随机存取,给个偏移就知道位置了,链式存储就是用指针指出下一个或者前一个,所以指出第几个还是得遍历一遍。不过是两种方法是可以结合的,详情百度LIST_ENTRY和List_Head。
          2,忘了,老早的东西了,转换在于等值和等价两种情况(我直记得这一句了)。树的遍历可以用栈模拟递归,但是相当固定,有可以不用栈直接用循环遍历的,只是比较难,也是以前都会现在忘了,后序遍历不用递归和栈是最麻烦的。其实直接用递归没什么,只是写成尾递归可以被优化成循环,其他没什么了。当然百度一下学会的更多,比如尾递归斐波那契。
          看到这一贴,本来想找找以前写的代码,发现好像全删了,基础数据结构只剩AVL没写,当时是因为觉得推导过程有问题,RB树则相对简单多了。不过AVL还是应用广泛,毕竟效率高。


          5楼2013-12-31 11:17
          回复
            我的小号里有代码


            来自Android客户端6楼2013-12-31 11:23
            回复
              构造数据元素后,代码就基本没差别了。
              毕竟代码就是为了脱离硬件编程而存在的。


              7楼2013-12-31 11:29
              收起回复
                1.顺序存储和链式存储的区别?
                (一个是数组,一个是指针)但是代码的区别在哪里?
                2.递归与非递归如何用栈实现转换?
                3.遍历中也是要用顺序存储来做的吗?
                这是很重要的面试问题好吧..
                1等同于list /linkedlist.. 查找,增删,等不同...等等..
                2.递归相当于,用栈来不停的循环..递一次,把环境(主要就是函数参数)压一次
                3.这是一个传值还是传地址的问题..你把2弄懂了,3也就明白了.
                这三道题都没有标准答案..
                问题3就是为了你1 与2 背答案了..
                最后,出这个面试题的人有点水平.


                IP属地:广东8楼2013-12-31 11:39
                回复
                  2025-06-03 02:27:59
                  广告
                  @zzb12
                  前面那个先序遍历的伪代码是顺序存储的吗?
                  然后我做的这个后序遍历的是不是链式的了,用了节点
                  public void noRecursionTraverse(BiTreeNode T) {
                  // TODO Auto-generated method stub
                  SeqStack stack = new SeqStack();
                  if (T != null) {
                  stack.push(root);
                  while(!stack.isEmpty()){
                  BiTreeNode node= (BiTreeNode)(stack.peek());
                  stack.pop();
                  list.add(node.left);
                  if(node!=null&&list.contains(node)){
                  stack.push(node);
                  }
                  if(node.left!=null&&list.contains(node.left)){
                  stack.push(node.left);
                  }
                  还有就是你打得那个list是什么呀?eclipse一直报错啊


                  9楼2014-01-01 00:16
                  收起回复
                    轻轻松松,二楼到手,眼疾手快,值得拥有。
                    ——来自 爱贴吧 Windows Phone 客户端


                    来自WindowsPhone客户端10楼2014-01-01 10:58
                    回复