Construct Binary Tree from Preorder and Inorder Traversal
今天是一道有关二叉树的题目,来自LeetCode,难度为Medium,Acceptance为27.2%。
题目如下
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
解题思路及代码见阅读原文
回复0000查看更多题目
解题思路
首先,还是看到二叉树,想到二叉树的三种遍历方式。
然后,该题中由前序遍历的结果和中序遍历的结果构造二叉树显然可以采用前序遍历的方法递归的方法,构造根节点和它的左右子树。
思路如下:
首先,在前序遍历中,根节点是第一个元素;而在中序遍历中根节点在中间,它的左边是它的左子树,右边是它的右子树。因为题目中已经写明,没有重复的节点,所以很容易找到根节点在中序遍历中的位置,然后将其分成左右子树两个子数组。
然后,根据中序遍历中左右子树的长度,在前序遍历中截取相同长度的子数组,与中序遍历的两个子数组相对应。
最后,递归调用这个方法,就可以得到左右子树。
代码如下
Java版
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
*@param preorder : A list of integers that preorder traversal of a tree
*@param inorder : A list of integers that inorder traversal of a tree
*@return : Root of a tree
*/
public TreeNode buildTree(int[] preorder, int[] inorder) {
// write your code here
return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
}
private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd){
if(preStart > preEnd || inStart > inEnd)
return null;
int val = preorder[preStart];
TreeNode root = new TreeNode(val);
int temp = inStart;
while(inorder[temp] != val)
temp++;
root.left = buildTree(preorder, inorder, preStart + 1, preStart + 1 + temp - 1 - inStart, inStart, temp - 1);
root.right = buildTree(preorder, inorder, preEnd - (inEnd - temp - 1), preEnd, temp + 1, inEnd);
return root;
}
}