Sword 07

https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/

重建二叉树

如果手算的话,先由先序遍历的根节点确立中序遍历中根节点的位置

这样根据中序遍历的性质就可以将二叉树分为两部分,也就将先序遍历的二叉树分为两部分

这时候关于原树的根节点,与左右子树的关系就已经明了

再递归的求左右子树即可(发现将问题分解成了两个同性质的,小规模的问题)

下一步就是将小规模当做已知,构建大规模和两个小规模之间的关系

TreeNode * ret = new TreeNode(preorder[root]);

ret->left = recur()

ret->right = recur()

再说说,recur 中参数如何设定的问题,很明显我们需要通过前序的根节点来分割中序遍历数组,所以一定要有前序的根节点下标,中序的左起点和右终点

再说转移式子中两个 recur 的参数问题,根据前序遍历根节点找到中序根节点(由于值不同)再中序数组确定长度反推前序的下一步两个根节点即可

记住递归的几个要点:

1、递归终止条件要记得

2、将大问题分解成数个**规模缩小**同等性质**的问题

3、写出大问题转移到小问题的转移式

4、将小问题当做已知去求解(有些类似于数学归纳法)

 

posted on 2021-03-03 12:04  FriskyPuppy  阅读(36)  评论(0编辑  收藏  举报

导航