回 帖 发 新 帖 刷新版面

主题:关于二叉树的递归遍历问题

看到数据结构书上的二叉树遍历算法,以先序遍历来说:
  void preorder(Btree *p)
  {
      if(p!=Null)
      {   printf("%c",p->data);
          preorder(p->lchild);
          preorder(p->rchild);
       }
   }
 
不知道这怎么就可以遍历整个二叉树,我画了图,在纸上根据算法在一步一步的写,但是就是不能得到整个结果,总是在某一个叶子节点就结束,而没办法写下一个结点的数据,不知道递归遍历这个算法应该怎么看


论坛的朋友们知道的话请帮我解释一下,谢谢了

回复列表 (共2个回复)

沙发

建议你给每条语句加一个标号,画图的时候,每画一步,把对应的语句标号也带上,这样你就知道画完某个叶结点后,下面该执行哪条语句了。

板凳

首先有这么概念,递归的终止条件是什么,就是这个节点是空节点,也就是不存在。
所以你把整棵树都画出来了,再把没个叶子节点(没有孩子的节点)的孩子都画出来,只是这些孩子是不存在的,也就是当递归运行到了这些不存在的孩子这里(NULL),就停了。
递归的运行就是函数堆栈,解释有点麻烦,理解了就能在纸上画出运行过程了。
当第一次运行递归函数(简称F),运行到内容里F的时候,压入F2,也就是第二次运行F,再继续运行第二个F里的F,压入F3,也就是第三个F,假设这里递归碰到停止条件了,第三个F运行完毕。这时程序继续运行,第三个F被STACK弹出,继续运行F2中F3下面的代码,而且这个过程就叫回溯。
再理解一下把。。
用一颗二叉树可以在纸上写出运行过程,只要你严格按照代码执行,就一定能画得出,画得科学一点,就会发现这是一棵二叉树。时间复杂度是2^n,很耗内存的。。所以能避免就避免,递归要额外储存函数运行的信息,也就是函数堆栈。

我来回复

您尚未登录,请登录后再回复。点此登录或注册