您的位置:首页 > 其它

5.2.1 Construct Binary Tree from Preorder and Inorder Traversal

2014-07-16 07:53 531 查看
原题链接:https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

这道题看起来不难,但还是没有完整的思路。

我的思路:

设Pre = {1, 2, 4, 5, 3, 7}, In = {4, 2, 5, 1, 3, 7}. 首先我们从pre中知道1是根节点,那么在In里找到1, 则1左边的是它的左子树,右边是它的右子树。然后怎么做?

然后应该递归。(注意递归的思想)。

Time: O(n), Space: O(logn)

以下代码来自:http://blog.csdn.net/muscler/article/details/22907537

/**
* Definition for binary tree
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {

public TreeNode buildTree(int[] preorder, int[] inorder) {
if (inorder == null || preorder == null || inorder.length != preorder.length)
return null;
int n = inorder.length;
return buildTree(preorder, inorder, 0, n - 1, 0, n - 1);
}

//dfs (为什么是DFS?) 根据前序遍历和中序遍历生成二叉树
public TreeNode buildTree(int[] preorder, int[] inorder, int s1, int e1, int s2, int e2) {
if (s1 >= inorder.length || s2 >= inorder.length) return null;
//if (s1 == e1) return new TreeNode(preorder[s1]);//不要这两行代码也可以AC
//if (s1 > e1 || s2 > e2) return null;

//前序遍历数组的第一个是根节点
int rootval = preorder[s1];
TreeNode root = new TreeNode(rootval);
int i;

//根据根节点在中序遍历数组里面找到左子树和右子数节点的个数
for (i = s2; i <= e2; i++) {
if(inorder[i] == rootval)
break;
}
int leftlength = i - s2;
int rightlength = e2 - i;

//dfs
root.left = buildTree(preorder, inorder, s1 + 1, s1 + leftlength, s2, i - 1);
root.right = buildTree(preorder, inorder, s1 + leftlength + 1, e1, i + 1, e2);
return root;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: