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
思路
-
二叉树的前序遍历特征:首个元素为根,然后是左子树和右子树
-
二叉树中序遍历特征:先是左子树,然后根,最后是右子树
-
因此可以先根据前序遍历中根的值,找到中序遍历根的索引, 这样就可以在中序遍历中找到左右子树。
-
然后采用递归的思路,从叶子结点开始依次往上递归建树,递归出口为:当节点为叶子节点或树为空时。
Java实现
/**
* 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 preIn(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1);
}
public static TreeNode preIn(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight) {
if (preorder.length == 0) {
return null;
}
// 创建根节点
TreeNode root = new TreeNode(preorder[preLeft]);
root.left = null;
root.right = null;
// 存储左子树的长度
int leftLength = 0;