LeetCode刷题笔录Construct Binary Tree from Preorder and Inorder Traversal

30 篇文章 0 订阅
15 篇文章 0 订阅

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:

You may assume that duplicates do not exist in the tree.

像一般的tree的问题一样,这题也用递归比较好。

比如这样子的序列:

preorder: 1245367

inorder: 4251637

可以一眼看出的是1一定是这颗树的root,因为pre order traversal是先访问节点本身再访问子树的。再看看in order traversal里面1的位置,是在中间。按照Inorder的定义,先访问左子树再访问右子树。因此可以知道在In order traversal的序列中排在1前面的都是1的左子树的元素,排在1后面的都是1的右子树的元素。对于序列425,其pre order traversal必然是245;对于序列637,其pre order traversal必然是367.这样就有了一个基本的递归。

public class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        TreeNode root = buildTree(preorder, inorder, 0, 0, inorder.length - 1);
        return root;
    }
    
    public TreeNode buildTree(int[] preorder, int[] inorder, int preIndex, int inStart, int inEnd){
        if(inStart > inEnd)
            return null;
        TreeNode node = new TreeNode(preorder[preIndex]);
        if(inStart == inEnd)
            return node;
        else{
            int inIndex = search(inorder, preorder[preIndex]);
            int len = inIndex - inStart;
            node.left = buildTree(preorder, inorder, preIndex + 1, inStart, inIndex - 1);
            node.right = buildTree(preorder, inorder, preIndex + len + 1, inIndex + 1, inEnd);
            return node;
        }
    }
    public int search(int[] arr, int value){
        int index = -1;
        for(int i = 0; i < arr.length; i++){
            if(arr[i] == value){
                index = i;
                break;
            }
        }
        return index;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值