LeetCode解题笔记 28 —— 105.从前序与中序遍历序列构造二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m940034240/article/details/89400642

题目

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   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 || preorder.length == 0){
            return null;
        }
        //前序遍历的第一位肯定是根结点
        TreeNode node = new TreeNode(preorder[0]);
        add(node, preorder, inorder);
        return node;
    }
    
    private void add(TreeNode node, int[] preorder, int[] inorder){
        int i;
         //查出根节点的值在中序遍历中位于第几位
        for(i = 0; i < inorder.length; i++){
            if(node.val == inorder[i]){
                break;
            }
        }
        //在i之前的数是左子树
        if(i > 0){
            int[] pr = new int[i];
            int[] in = new int[i];
            for(int k = 0; k < i; k++){
                pr[k] = preorder[1+k];//根节点后面的i位是左子树的前序遍历
                in[k] = inorder[k];//前i-1位是左子树的中序遍历
            }
             //前序遍历的第一位肯定是根结点
            node.left = new TreeNode(pr[0]);
            if(i > 1){
                add(node.left, pr, in);
            }
        }
        
         //在i之后的数是右子树
        if(i < inorder.length-1){
            int length = inorder.length - 1 - i;
            int[] pr = new int[length];
            int[] in = new int[length];
            for(int k = 0; k < length; k++){
                pr[k] = preorder[i+1+k];  //在左子树后的所有数为右子树的前序遍历
                in[k] = inorder[i+1+k];   //在根节点位置后的所有数为右子树的中序遍历
            }
             //前序遍历的第一位肯定是根结点
            node.right = new TreeNode(pr[0]);
            if(length > 1){
                add(node.right, pr, in);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m940034240/article/details/89400642