前沿:

   前段时间参加了:小米、东软、百度的笔试,多家公司都出了一道类似二叉树题来考查笔试者对二叉树基础掌握的情况。

 一:笔试题描述

    1:有一颗二叉树:前序遍历输出的字符串顺序为:ABCDEFG

                    中序遍历输出的顺序是:CBDAEGF

   2:问?请根据前序和中序遍历出的结果,推断出后序遍历输出的结果?

 二:解决以上问题依据的知识点如下:

      二叉树三种遍历的方式:

           前序遍历(NLR): 根->左孩子->右孩子

         中序遍历(LNR):  左孩子->根->右孩子

         后序遍历(LRN):  左孩子->右孩子->根

 三:问题分析

  第一步:前序:ABCDEFG

                  根据前序遍历的原则我们可以确定:二叉树的根元素为:A

第二步:根据中序 CBDAEGF

1:原则:左孩子->->右孩子

2:推出:CBD(根左边的元素A(根元素EGF(根右边的元素)

 

 第三步:根据 前序和中序输出的结果来还原一棵二叉树

   前序输出:A(根)  BCD(左边元素) EFG(右边的元素)

   根据前序遍历的原则:->左孩子->右孩子

   推出:如下图:

 

 第四步:B元素后面是C元素,C元素有二种可能1:B的左孩子2:B的右孩子

   我们假设CB的右孩子:得到如下图:

 

验证:我们来看看中序:CBD(左边元素)   A(根)    EGF(右边元素) 

        中序的遍历规则是: 左孩子->->右孩子,如果按照上面的假设CB的右孩子

            中序遍历时应该是:BC..显然不对,因此C应该是B的左孩子.因此进一步得出如下:


第五步: 根据前序:A() BCD(根左边的元

素)  EFG(根右边的元素)

 

分析:

C元素后面紧跟是D元素

D元素现在有三种可能:B的右孩子,C的左孩子或者右孩子

 

1:如果D是C的左孩子,图下图:

 

 

验证:

1:如果DC的右孩子,那么中序遍历根的左边应该是:DCB与中序CBD不相符合,所以不对
2:如果是右孩子:中序遍历,根的左边应该是:CDBCBD也不相符合,所以不对

3:综上得出D应该是B的右孩子,如下图:

 

第六步:根据以上的思路,我可以把根的右边也还原,得出完整的二叉树结构如下:

 

 

 

第七步:根据后序遍历:左孩子->右孩子->根的遍历原则:

             因此很容易得出后序为:CDBGFEA

所以最终答案 为:CDBGFEA

ps:

  有人说:算法是程序设计的灵魂 | 我说:算法能激活我更多的思维 |在算法的道路上我才刚刚开始|加油|坚持!

                                     coder:亮仔 2012-10-7