- 问题描述:Given preorder and inorder traversal of a tree, construct the binary tree.还有个是中序和后序。其实两个题本质是一样的。
- 问题分析:暂时只想到递归的方法来解题,可是看到耗时似乎蛮高的,不知道还有什么更搞笑的解法。
这个思路没什么好讲的,通过先序或者后序找出根节点,然后将中序的序列分开,这样就可以 找出左子树和右子树,然后对左子树和右子树继续用递归即可搞定。代码如下:
<span style="font-family:Microsoft YaHei;">/** * Definition for a binary tree node. * 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(preorder == null ||inorder == null || preorder.length == 0 || preorder.length != inorder.length) return null; return buildTree(preorder,inorder, 0,preorder.length-1, 0, inorder.length-1); } public TreeNode buildTree(int[] preorder, int[] inorder, int i, int j, int k, int l){ if(i == j) return new TreeNode(preorder[i]); int index = k; for(; index <=l && preorder[i] != inorder[index]; index++); // for(int idx = k+1; idx <= l; idx++) // if(preorder[i] == inorder[idx]){ // index = idx; // break; // } TreeNode root = new TreeNode(preorder[i]); if(index > k) root.left = buildTree(preorder, inorder, i+1, i + index-k, k, index -1); if(index < l) root.right = buildTree(preorder, inorder, i+index-k + 1, j, index +1, l); return root; } }</span>
<span style="font-family:Microsoft YaHei;">/** * Definition for a binary tree node. * 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(preorder == null ||inorder == null || preorder.length == 0 || preorder.length != inorder.length) return null; return buildTree(preorder,inorder, 0,preorder.length-1, 0, inorder.length-1); } public TreeNode buildTree(int[] preorder, int[] inorder, int i, int j, int k, int l){ if(i == j) return new TreeNode(preorder[i]); int index = k; for(; index <=l && preorder[i] != inorder[index]; index++); // for(int idx = k+1; idx <= l; idx++) // if(preorder[i] == inorder[idx]){ // index = idx; // break; // } TreeNode root = new TreeNode(preorder[i]); if(index > k) root.left = buildTree(preorder, inorder, i+1, i + index-k, k, index -1); if(index < l) root.right = buildTree(preorder, inorder, i+index-k + 1, j, index +1, l); return root; } }</span>
07-14
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交