算法的js实现以及思考

二叉树还原

2020-10-23  本文已影响0人  xiaoznz

二叉树是什么?什么是先序遍历,等等这些问题回头开个专题文章讲述,今天主要弄得是二叉树还原。

假设我们手头有一个一个先序遍历的数列,一个中序遍历的数列,现在让我们还原对应的二叉树,怎么做?(中序和后序也一样)

因为是先序遍历的,所以对应的数列对应得第一个值就是原二叉树的根节点,我们只需要去先序遍历的第一个元素即可。

得到了根节点我们直接去中序遍历中找到根节点对应的序号(nodeIndex),用indexOf取得,这样我们可以说知道了根节点对应的左右子树中的数值。

接着,我们对得到的左右子树进行上述操作,也就是递归,并返回递归的结果,将其绑定在根节点的左右,一个二叉树还原就做好了。

这是我写出的对应的代码:

这个算法的迷惑点对我来说有两个,一个是递归得到的先序遍历,中序遍历中的参数如何得出的?二是怎么知道已经遍历完了?

对于第一个问题,我们来进行推导:

对于左子树(leftArr)

NLR中,因为这个是先序遍历,所以根节点是第一个,slice的序号应该从第二个数也就是1开始,然后截止到整个左子树的长度为止,左子树的长度是多少呢?因为有个中序遍历,他的左子树长度就是根节点的序号,也就是nodeIndex,所以slice的截止参数应该是nodeIndex+1(slice算头不算尾)

LNR中,对于中序遍历,起点就是左子树的开始,结束为止为根节点前,所以左右的参数为0,nodeIndex

对于右子树(rightArr)

NLR中,从前面的截取位置开始,到最后一直是,截取位置是nodeIndex+1,所以照抄

LNR中,根节点后的序号应该是nodeIndex+1,所以也是nodeIndex+1

第一个问题得到了解决

第二个问题:

这个很简单,我们在开头直接判断,如果传的NLR为空,直接返回,也就是判断NLR[0]是否存在即可

这就是今天的算法和总结了,每天一个,强身健脑,明天见!

上一篇 下一篇

猜你喜欢

热点阅读