正文
也是认识的一个小哥们最近面试题中给出的一个二叉树前中后序的题。
记得当初自己已经很明白这个前中后序的过程,然后今天却算了好了好久通过查询相关知识,只能对着结果自己一遍一遍的算,不停的写那个结果最后还是搞明白了,这次要把过程 给记录下来。
二叉树的前序(1-2-3-4-5-6-7-8-9),中序(2-3-1-6-7-8-5-9-4)然后求后序?
再讲题前,我先给出这些概念的详细讲解,用图来分析:
图是我自己花的,也是照着《算法导论》第12章,二叉搜索树 -286页花的,以下的前中后序讲解都是说的这个图。
前序的过程是:根节点->左子树->右子树;其实这个大家一看都知道,何必我说呢。确实如此,我看书也能看明白,不是就根左右嘛,如果我再细一点我想大家会更容易理解。这就是我要写的必要。这种遍历,第一个是根节点,什么是根节点就是不是叶子节点,也就是左右都有或左有或右有。然后遍历第一个根节点就是 6 我们按照最上面的根节点遍历前序,这是理解的要点。那么往下走,5也是根节点好了5下面的2 和 5是叶子了,那么就要按照先左后的方式走了。那么现在已经走了到 6 5 2 5,先左后右,先上后下。然后看右边。7 好这个是根根节点,往下 8 不是根也就是直接读取了。那么最后是什么? 6 5 2 5 7 8 ,前序说完了,不知道你是否明白了呢?
中序的过程是:左子树->根节点->右子树;那么这点就要不同于前序了,这个规则是要按照左开始的,一定要强调左 。往左找,往下找,找到第一个。然后我们找到了 2,ok,2是叶子节点所以没了,网上找 然后是 5 ,我们这里要注意了,在遍历的过程中我们都是按照一个单元一个单元的去完成的,这个单元是我给起的名字的。什么是一个单元,就是一套左根右。所以到了这里,你走到 2 往上是根 5 ,还需要把 右边的 5 完成后,才能接着往上在找。所以左半边的结果就是 2 5 5 6 。找完左边,找右边。7 是根那么就接着往下找,一个就是一个 右叶子 8 ,ok,那么左叶子没有了,而中序的第二位是根,那么就有了 7 在 8 前面。好啦,最后的中序结果就是 2 5 5 6 7 8 。准备好了后序了吗?我想你已经很明白了。
后序的过程是:左子树->右子树->根节点;也就是把最上面的根节点放到最后就对了,这个跟中序很像。我们还是找左,依旧是 2 ,然后呢考虑到顺序,单元的第二位就是 右边叶子节点的 5 了,所以是 2 5(叶子的) 5 (根) ,完成一个单元,往上走到6,一看是根那,我们顺序应该是左右根,所以不是它。找右边,7 是根,接着往下找,找到 8 ,ok因为没有了左叶子,第二位是右叶子那么就是 8 了,往上是 7 再到最后的 6 。The result is 2 5 5 8 7 6。
ok,已经叙述完毕,不知道是否说的明白。欢迎大家一起讨论,交流。那么刚开始的题呢?我想大家可以算出来了。