前沿:算法
前段时间参加了:小米、东软、百度的笔试,多家公司都出了一道相似二叉树题来考查笔试者对二叉树基础掌握的状况。ide
一:笔试题描述 |
1:有一颗二叉树:前序遍历输出的字符串顺序为:ABCDEFGspa
中序遍历输出的顺序是:CBDAEGF设计
2:问?请根据前序和中序遍历出的结果,推断出后序遍历输出的结果?code
二:解决以上问题依据的知识点以下: |
二叉树三种遍历的方式:orm
前序遍历(NLR): 根->左孩子->右孩子blog
中序遍历(LNR): 左孩子->根->右孩子ci
后序遍历(LRN): 左孩子->右孩子->根字符串
三:问题分析 |
第一步:前序:ABCDEFGget
根据前序遍历的原则咱们能够肯定:二叉树的根元素为:A
第二步:根据中序 CBDAEGF
1:原则:左孩子->根->右孩子
2:推出:CBD(根左边的元素) A(根元素) EGF(根右边的元素)
第三步:根据 前序和中序输出的结果来还原一棵二叉树
前序输出:A(根) BCD(左边元素) EFG(右边的元素)
根据前序遍历的原则:根->左孩子->右孩子
推出:以下图:
第四步:B元素后面是C元素,C元素有二种可能1:B的左孩子2:B的右孩子
咱们假设C是B的右孩子:获得以下图:
验证:咱们来看看中序:CBD(左边元素) A(根) EGF(右边元素)
中序的遍历规则是: 左孩子->根->右孩子,若是按照上面的假设C是B的右孩子
中序遍历时应该是:BC..显然不对,所以C应该是B的左孩子.所以进一步得出以下:
第五步: 根据前序:A(根) BCD(根左边的元
素) EFG(根右边的元素)
分析:
C元素后面紧跟是D元素
D元素如今有三种可能:B的右孩子,C的左孩子或者右孩子
1:若是D是C的左孩子,图下图:
验证:
1:若是D是C的右孩子,那么中序遍历根的左边应该是:DCB与中序CBD不相符合,因此不对
2:若是是右孩子:中序遍历,根的左边应该是:CDB与CBD也不相符合,因此不对
3:综上得出D应该是B的右孩子,以下图:
第六步:根据以上的思路,我能够把根的右边也还原,得出完整的二叉树结构以下:
第七步:根据后序遍历:左孩子->右孩子->根的遍历原则:
所以很容易得出后序为:CDBGFEA
因此最终答案 为:CDBGFEA
ps:
有人说:算法是程序设计的灵魂 | 我说:算法能激活我更多的思惟 |在算法的道路上我才刚刚开始|加油|坚持!
coder:亮仔 2012-10-7