zoukankan      html  css  js  c++  java
  • 对二叉树遍历操作的深入思考

    对二叉树遍历操作的深入思考

    已知某棵二叉树,容易求得它的某种遍历序列,但是,反过来,若已知某种遍历序列,是否可以唯一确定一棵二叉树呢?

    1、若已知先/中/后序序列......

    例:已知先序列为0-1-2-3-4-5-6-7-8

    对应情况:

    可以看到,两幅图片虽然先序是一样的,但两棵树完全是不同的两棵树。

    2、若已知中序和后序序列......

    例:

    已知中序遍历:B D C E A F H G

    已知后序遍历:D E C B H G F A

    结果:

    推断过程:

    • (1)从后序遍历表中以及后序的性质,可以判定A是根

    • (2)从中序遍历表中以及中序的性质,加以条件(1)以知道BDCE是A的左子数,FHG是A的右子树

    • (3)先看FGH,在后序遍历中可以看到顺序是HGF可以说明F是A的右结点;看中序遍历可以看到顺序是FHG,如果F有左子结点的话,根据中序遍历的性质,中序遍历表中A的后面绝逼不是F,但结果是F,说明F没有左结点;要实现在中序遍历中,F后面的结点排布是H G的话,就要使H是G的左节点,综上所述,这一步可以得到这么个结果:

    • (4)再看BDCE,从中序遍历可以看到顺序为:BDCE,若B有左子结点,则第一个不会是B,说明B并没有左子结点;从后序遍历中可以看到,顺序为:DECB,说明B是A的左子结点;剩下DCE,根据中序遍历,我有两种猜想

    但是根据后序遍历所示,顺序为:DEC,对于第一种猜想,应该E是D的根,与猜想1的情况出入,因此猜想2为正确的,综上所述,可以得到这么个结果:

    因此可以得到一条定律:后序定根,中序分左右。

    3、若已知中序和先序序列......

    例:

    已知中序遍历:G D H B A E C I F

    已知先序遍历:A B D G H C E F I

    结果:

    推断过程:

    类似上面的运用两种遍历方法的性质和遍历表的排布,我就懒得写了,推一推就出来了...

    4、若已知先序和后序序列......
    例:

    二叉树前序遍历为ABDEGCFH,后序序列为DGEBHFCA
    可以确定第一个根节点是A,A第一个子树根节点是B,根节点为B的子树后序遍历为DGEB,前序遍历为BDEG,A第二个子树根节点为C,他的后序遍历为HFC,前序遍历为CFH,然后一次递归。简单起见,我们只看A第二个子树,即右子树C。C的第一个根节点F,子树F的后序遍历HF,前序遍历FH,C没有第二个子树,这时不管F为左子树还是右子树都是满足要求的。同理F的子树H。

    图中只有一个子树的用两条线连接,表示这是左右子树均可。

    最后结论:中序+先序,或中序+后序均能唯一确定一棵二叉树,但先序+后序却不一定能唯一确定一棵二叉树。

  • 相关阅读:
    Java中的阻塞队列
    大数据笔记
    物联网小笔记
    shell 笔记
    Redis笔记
    rabbitMQ笔记
    java.lang.NoClassDefFoundError: freemarker/template/Template
    分布式系列学习-事务处理
    免费无需破解xshell xftp下载
    idea maven模块变灰或者java文件夹非 Sources文件夹
  • 原文地址:https://www.cnblogs.com/VersionP1/p/7703548.html
Copyright © 2011-2022 走看看