[LeedCode]从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   /  \
  9    20
      /  \
    15   7

分析:由于前序遍历是根左右的遍历顺序。中序遍历是左根右的遍历顺序。所以本题的关键是找到根节点在后续遍历的位置。对于 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 。 用红色表示根节点,蓝色表示左子树,绿色表示右子树,结果应该如图所示。
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder == null || inorder == null || preorder.length != inorder.length){
            return null;
        }
        return helper(preorder,0, preorder.length-1,inorder,0,inorder.length-1);
    }

    public TreeNode helper(int[] preorder, int pStart, int pEnd, int[] inorder, int iStart, int iEnd) {
        //递归的第一步:递归终止条件,避免死循环
        if(pStart > pEnd || iStart > iEnd){
            return null;
        }
        TreeNode treeNode = new TreeNode(preorder[pStart]);
        int index = 0;
        while(preorder[pStart] != inorder[iStart + index]){
            index ++;
        }
        //重建左子树
        treeNode.left = helper(preorder, pStart + 1, pStart + index, inorder, iStart, iStart + index - 1);
        //重建右子树
        treeNode.right = helper(preorder, pStart + index + 1, pEnd, inorder, iStart + index + 1, iEnd);
        return treeNode;
    }
}
发布了84 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_36254699/article/details/100172800