利用中序数组和先序数组重建一棵树

当给出两组数组,一个是原树的先序数组,另一个是中序数组,让我们重建一棵树,该如何去实现呢

我们需要找到两个数组一定相同的且是所在该数组最小的根节点,先序打印出的树,第一个出现的数一定为根节点,这样我们就找出先序数组的根节点了

想要找到中序数组的根节点其实也不难,拿着上一个找出的根节点到这个数组中一个个遍历就好了,我们把先序找出的根节点称为head,而中序找出的根节点称为find

我们来假设一个例子,假如那棵树有三个以上的节点,我们会发现先序数组的左子树肯定要比右子树先打印出来。而同样的中序数组的左子树肯定要和右子树把根节点夹在中间(前提都是左右子树都有节点的情况下)

这样我们可以设定左右子树的边界进而可以大概重塑出这棵树

写代码时要考虑到几个情况,根据我们所推出来的,第一点就是两个数组不能为空且长度必须相等,不然没有重塑的必要了。第二点在重塑树的时候,传入的左右边界,左边界一定是恒小于右边界的,而且当左右边界重合,基本可以确定这棵树只有一个节点

我们会发现在传入参数寻找find节点似乎有点太麻烦了,需要把传入的数组全都遍历一次才能得到find的位置我们可以利用一张hashmap来把传入的数组记住,方便我们后续使用

现在似乎一切都明了了,只需要构造出树的元素就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值