所谓找到从m到n的路径,即辅助栈中存在从m到n的路径。
本文中树的访问顺序采用先序;
遇到元素先入栈,何时出栈输出则需要具体考虑;
以上图为例:
1、先序:
进入m:
m入栈,m出栈并输出;
进入m的左子树a:
a入栈,a出栈并输出;
a为叶子节点,左右孩子均为空;
回退至m;
进入m的右子树b:
b入栈,b出栈并输出;
进入b的左子树n:
n入栈,n出栈并输出;
n为叶子节点,左右孩子均为空;
回退至b;
进入b的右子树c:
c入栈,c出栈并输出;
c为叶子节点,左右孩子均为空;
回退至b;
回退至m;
总结:先序,栈内元素入栈后立马出栈输出,栈内最多只有一个元素,不存在从m至n的路径。
2、中序:
进入m:
m入栈(栈内情况:m);
进入m的左子树a:
a入栈(栈内情况:ma);
进入a的左子树NULL:
a的左子树为空,a出栈并输出(栈内情况:m);
回退至a;
进入a的右子树NULL:
a的右子树为空;
回退至a;
回退至m;
m的左子树遍历完毕,m出栈并输出(栈内情况:空);
进入m的右子树b:
b入栈(栈内情况:b);
进入b的左子树n:
n入栈(栈内情况:bn);
进入n的左子树NULL:
n的左子树为空,n出栈并输出(栈内情况:b);
回退至n;
进入n的右子树NULL:
n的右子树为空;
回退至n;
回退至b;
b的左子树遍历完毕,b出栈并输出(栈内情况:空);
进入b的右子树c:
c入栈(栈内情况:c);
进入c的左子树NULL:
c的左子树为空,c出栈并输出(栈内情况:空);
回退至c;
进入c的右子树NULL:
c的右子树为空;
回退至c;
回退至b;
回退至m;
总结:中序,当左子树为空或左子树遍历完成时,当前元素出栈,在n入栈之前,m早已出栈,栈内不存在从m至n的路径。
3、后序:
进入m:
m入栈(栈内情况:m);
进入m的左子树a:
a入栈(栈内情况:ma);
a为叶子节点,左右孩子均为空,a出栈并输出(栈内情况:m);
回退至m;
进入m的右子树b:
b入栈(栈内情况:mb);
进入b的左子树n:
n入栈(栈内情况:mbn);//栈内出现了从m到n的路径
n为叶子节点,左右孩子均为空,n出栈并输出(栈内情况:mb);
回退至b;
进入b的右子树c:
c入栈(栈内情况:mbc);
c为叶子节点,左右孩子均为空,c出栈并输出(栈内情况:mb);
回退至b;
b的左右子树均遍历完毕,b出栈并输出(栈内情况:m);
回退至m;
m的左右子树均遍历完毕,m出栈并输出(栈内情况:空);文章来源:https://www.toymoban.com/news/detail-441358.html
总结:后序,当左右子树均为空(当前为叶子节点)或左右子树均遍历完毕时,当前元素出栈,并且m与n可同时存在于栈内,即存在从m至n的路径。文章来源地址https://www.toymoban.com/news/detail-441358.html
到了这里,关于在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径。(解答思想)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!