leetcode array tree dfs|105. Construct Binary Tree from Preorder and Inorder Traversal

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

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

For example, given

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

给出先序遍历和中序遍历构造这棵树,根据preorder可以得到根节点,根据inorder可以得到左右子树的内容,两者相辅相成,得到最终结果

在刚开始的时候犹豫了很久在递归函数中到底要穿什么参数,其实有很重要的一点是不管是什么遍历,左右子树之间是没有交叉的。

/**
 * 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) {
        //根据先序遍历可以得到根 中序遍历可以得到左右子树
        return build(0,0,inorder.length-1,preorder,inorder);
    }
    
    public TreeNode build(int prestart,int instart,int inend,int[] preorder,int[] inorder){
        //有了先序遍历的起始位置实际上就有了根
        if(instart>inend||prestart>=preorder.length) return null;
        TreeNode temp=new TreeNode(preorder[prestart]);
        //int pos=Arrays.binarySearch(inorder,preorder[prestart]);  //根在中序遍历的位置
        //在网上查了一个可以定位数组中元素的位置的函数,在使用之后出现数组越界异常
        //经再次详细查阅资料后发现此方法只适用于有序数组,所以还是自己老实遍历吧
        int pos=0;
        while(inorder[pos]!=preorder[prestart]){
            pos++;
        }
        temp.left=build(prestart+1,instart,pos-1,preorder,inorder);
        temp.right=build(prestart+pos-instart+1,pos+1,inend,preorder,inorder);
        return temp;
    }
    
}
 

还有就是调用库函数的时候注意使用的情况,好好看文档。

其实代码,把思路想清楚再动手就很好写了。

 
扫描二维码关注公众号,回复: 2680861 查看本文章

猜你喜欢

转载自blog.csdn.net/xueying_2017/article/details/81209710