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

思路:递归分冶

这道题有点像根据数组构造二叉搜索树那道题,只不过,这里说了是根据两个数组进行判断。

一般我们在数据结构的题目当中都是靠试一试的想法做出这样判断二叉树的题,但是到了真正写程序的时候,思路就显然不知道怎么样了,因为我们需要让计算机知道大脑是怎么想的。

我们知道,前序遍历的第一个结点就是根节点,我们可以在对应的中序遍历列表中找到与其对应的元素的下标,这个下标的往左一直到结束,就是左子树的部分,往右就是右子树的部分,所以我们就初步判断了这样的结论。我们可以想,接下来的步骤是不是也可以按照这个想法进行呢?我们截取除根节点以外的左子树部分,然后再从中找出一个类根结点,这个结点就是这棵树的左子树的第一个结点,同理,右子树也能找到这样的一个类根节点。我们一直递归下去不就能够构造出一棵树了吗?

顺着这个思路,我们知道了:通过递归的方法,以及切割数组的方法来判断每次子树的根节点,然后相连接起来,合成的就是一颗完整的树了,其本质就在于找各个子树的根节点。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length==0||inorder.length==0)
        return null;
        int index=0;
        for(int i=0;i<inorder.length;i++){
            if(preorder[0]==inorder[i]){
                index=i;
                break;
            }
        }
        TreeNode root=null; 
        root=bianli(root,preorder,inorder);
        return root;

    }
    public TreeNode bianli(TreeNode t,int []a,int []b){
        if(a.length==0||b.length==0){
            return null;
        }
        TreeNode tmp=new TreeNode();
        for(int i=0;i<b.length;i++){
            if(a[0]==b[i]){
                tmp.val=b[i];
                t=tmp;
                int []a_l=Arrays.copyOfRange(a,1,i+1);
                int []a_r=Arrays.copyOfRange(a,i+1,a.length);
                int []b_l=Arrays.copyOfRange(b,0,i);
                int []b_r=Arrays.copyOfRange(b,i+1,b.length);
                t.left=bianli(t.left,a_l,b_l);
                t.right=bianli(t.right,a_r,b_r);
            }
        }
        return t;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值