在二叉树中有两个结点m和n,若m是n的祖先,则使用后序遍历可以找到从m到n的路径。(解答思想)

所谓找到从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出栈并输出(栈内情况:空)

总结:后序,当左右子树均为空(当前为叶子节点)或左右子树均遍历完毕时,当前元素出栈,并且m与n可同时存在于栈内,即存在从m至n的路径。

  • 41
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值