|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题:
在二叉树中有两个结点m和n,若m是n的祖先,则使用()遍历可以找到从m到n的路径。
答案是 后序遍历
但是为什么先序和中序不行呢?
我认为递归过程中使用的栈可以说是程序过程间调用的栈 首先遍历m的过程 调用了遍历a的过程 然后返回到了m 然后遍历m的过程又调用了遍历d的过程 又返回到了m 不管是前中后序哪一种遍历都是这样一个过程调用的栈的结构 根总是最后一个出栈 栈中并不是只保存了有用的节点 被调用的过程 总是会返回到调用他的过程中 程序总是这样的一个过程。
所以无论先序,中序,后序使用递归算法执行的时候递归过程相同,只是在某递归语句前后执行的语句不同。
- //先序遍历
- bool PreOrder(BiTree t)
- {
- if (!t)
- return false;
- visit(t);
- //printf("%2c", t->data);
- PreOrder(t->lchild);
- PreOrder(t->rchild);
- return true;
- }
- //中序遍历
- bool InOrder(BiTree t)
- {
- if (!t)
- return false;
- InOrder(t->lchild);
- printf("%2c", t->data);
- InOrder(t->rchild);
- return true;
- }//后序遍历
- bool LastOrder(BiTree t)
- {
- if (!t)
- return false;
- LastOrder(t->lchild);
- LastOrder(t->rchild);
- printf("%2c", t->data);
- return true;
- }
复制代码
代码对应二叉树结构如图:
遍历实际上是有入栈和出栈操作的。
若 n 是右节点,那么先序遍历和中序遍历在遍历到祖先节点 m 之后 m 就出栈了。那么再去遍历到 n 节点的时候就不知道如何从m到n的了
只有后序遍历中,祖先节点 m 是最后出栈的,所以能够追溯m到n的路径。
|
|