思路:
- 前序遍历的第一个节点就是当前的根节点
- 在中序遍历中找到根节点
- 中序遍历根节点左边的节点就是根节点左子树,右边的就是右子树,假设左子树n{n}n个节点,右子树m{m}m个节点
- 前序遍历第一个元素后的n{n}n个节点是属于左子树的,剩下的是右子树的
- 分别得到了左、右子树的前序遍历序列和中序遍历序列,形成子问题
- 递归
其中第二步也可以借助一个map来提高检索效率
/**
* @Classname Solution
* @Description 重建二叉树
* @Date 2019/12/17 15:36
* @Created by Cheng
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre, int [] in) {
// 假设输入都是有效的
TreeNode root = recursion(pre, 0,pre.length-1,in,0,in.length-1);
return root;
}
private TreeNode recursion(int[] pre, int preStart,int preEnd,int[] in, int inStart, int inEnd) {
if (inStart>inEnd||preStart>preEnd) {
return null;
}
int val = pre[preStart];
TreeNode ret = new TreeNode(pre[preStart]);
for (int i = inStart; i <= inEnd; i++) {
if (in[i] == val) {
ret.left = recursion(pre, preStart+1,preStart+(i-inStart),in,inStart,i-1);
ret.right = recursion(pre, preStart+(i-inStart)+1,preEnd,in,i+1,inEnd);
break;
}
}
return ret;
}
}
本文深入探讨了如何使用前序遍历和中序遍历序列重建二叉树的算法思路,通过递归方法确定根节点,并划分左右子树,最终实现二叉树的完整重构。
958

被折叠的 条评论
为什么被折叠?



