查看: 3019|回复: 12
收起左侧

Microsoft : 根据前续遍历和中序遍历构建二叉树

|只看干货 |刷题
头像被屏蔽

分享帖子到朋友圈
wwwyhx | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:Google : 无限输入流取中数
下一篇:Microsoft : Sort 只含0,1,2三个元素的数组
kidd_yq@163.com 2011-4-27 15:10:23 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (22)
 
 
0% (0)    👎
根据前序遍历找出根结点,将中序遍历数组由根结点分为左子树的中序遍历和右子树的中序遍历,再利用元素的不同从前序遍历中找出左子树的前序遍历和右子树的前序遍历,再这样递归一下;

不过这个方法只适用于树中任两个结点都不同的情况;更复杂的情况我再想想。。。

评分

参与人数 1大米 +34 收起 理由
wwwyhx + 34

查看全部评分

回复

使用道具 举报

greenphoto 2011-4-27 15:31:02 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (3)
 
 
0% (0)    👎
前序遍历数组a[]; 中序遍历数组b[]

1、a[0]是根节点root, 假设root是b中的第i个元素,则b之前的元素都为root左子树的节点,其之后的元素都为右子树的节点

2、b1{b[0],b[1],...b[i-1]}是其左子树的中序遍历数组,a1{a[1], a[2],...a}为左子树的前序遍历数组

3、a1[0]为子树的root节点,对数组a1, b1再做类似的划分

4、以此类推,直到得到的新的子树数组中只有一个元素

评分

参与人数 1大米 +34 收起 理由
wwwyhx + 34

查看全部评分

回复

使用道具 举报

greenphoto 2011-4-27 16:29:43 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (3)
 
 
0% (0)    👎
不过这个方法只适用于树中任两个结点都不同的情况

kidd_yq@163.com 发表于 2011-4-27 15:10 [/quote]

结点相同的话,应该是在中序遍历数组中找最先出现的那一个?
回复

使用道具 举报

kidd_yq@163.com 2011-4-27 17:16:41 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (22)
 
 
0% (0)    👎
回复 4# greenphoto

我也不是很确定

                                     -
                                  /    \
                                 +      /
                              /   \    /  \
                            a    *    e    f
                                  / \
                                 b  -
                                    / \
                                   c  d

比如这个,有两个减号,中序遍历就是
a + b * c -d -e / f
也不是最先出现的那个,或许是我误解你的意思了?
回复

使用道具 举报

darksteel 2011-4-28 10:53:18 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
这题我记得是careercup上有的,用的是3楼类似的递归方法。不过确实没考虑楼上说到的问题,找最先出现的那个应该是不对的,可以考虑楼上的例子把所有符号都改成“-”。这样的话除了试遍所有情况不行就回溯好像没什么特别好的办法。不知道有没有人有别的更好的办法。
回复

使用道具 举报

liuzxiao 2011-4-28 11:34:51 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   94% (600)
 
 
5% (32)    👎
前序第一个节点是root,根据这个root在中序中找出左子树和右子树
再根据找出的子树,从前序中找出子树的根
递归下去

评分

参与人数 1大米 +34 收起 理由
wwwyhx + 34

查看全部评分

回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-4-28 12:50:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

greenphoto 2011-4-28 15:07:08 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (3)
 
 
0% (0)    👎
回复 8# wwwyhx

如果有节点相同的情况捏
只能一个个节点试过去,不行再回溯么
树的规模很大,重复节点多的时候,不是要做很多无用功了
回复

使用道具 举报

xyqshi 2012-10-9 02:18:36 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (1)
 
 
0% (0)    👎
看到这么长时间都没正确答案。。。不如我给一个。我也是才了解前序遍历和中序遍历,所以如果说错了请别介意。
原理就是用recursive,对于每一次循环,前序遍历的第一个点就是当前root点,然后在中序遍历中找到root点并且可以得到左右subtree的size,用size在前序遍历中得到左右subtree的前序遍历,然后recursive,这种算法不用考虑节点相同的情况
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■拉群请前往同学同事飞友|拉群结伴版块,其他版块拉群,帖子会被自动删除
■论坛不能删帖,为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://tools.1point3acres.com/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

>
快速回复 返回顶部 返回列表