根据一棵树的前序遍历与中序遍历构造二叉树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int preIndex = 0;
public TreeNode buildTreeChild(int[] preorder, int[] inorder,
int inbegin, int inend) {
if (inbegin > inend) return null;
TreeNode root = new TreeNode(preorder[preIndex]);
int inorderIndex = findInorderIndexroot(inorder,inbegin,inend,preorder[preIndex]);
preIndex++;
root.left = buildTreeChild(preorder,inorder,inbegin,inorderIndex-1);
root.right = buildTreeChild(preorder,inorder, inorderIndex+1,inend);
return root;
}
public int findInorderIndexroot(int[] inorder,int inbegin,int inend,int val) {
for (int i = inbegin; i <= inend; i++) {
if (inorder[i] == val) {
return i;
}
}
return -1;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null) return null;
if (preorder.length == 0 || inorder.length == 0) return null;
return buildTreeChild(preorder,inorder,0,inorder.length-1);
}
}
解题思路:
二叉树基本上都要用递归,所以要往这方面想,对于本题来说,知道前序遍历和中序遍历,那么就是找到根节点,前序遍历数组中定义一个preIndex,中序遍历数组中定义inbegin,inend ,然后找到根节点在中序遍历的位置,左边就是左节点,右边就是右节点,就是简单的递归问题了,递归要有终止条件,即(inbegin > inend)然后需要一个方法找节点。基本上就解决了。