重建二叉树

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

解题思路:1.通过找到前序遍历头节点在中序遍历中左子树长度,判断是否有左子树,和右子树。 如果存在则递归。

/**
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
/**
 * 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) {
        if (preorder==null||preorder.length==0) {
    		return null;
    	}
    	TreeNode node = construct(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1);
        return node;
    }
     public TreeNode construct(int[] preOrder, int prestart, int preend, int[] inOrder, int instart, int inend){
    	if(prestart>preend) {
    		return null;
    	}
    	TreeNode node = new TreeNode(preOrder[prestart]);
    	//左子树长度
    	int leftLength = leftLengthInOrder(instart, inend, node.val, inOrder);
    	if(leftLength>0) {
    		node.left = construct(preOrder, prestart+1, prestart+leftLength, inOrder, instart, instart+leftLength-1);
    	}
        //判断需不需要递归右子树
    	if(leftLength<preend-prestart) {
    		node.right = construct(preOrder, prestart+leftLength+1, preend, inOrder, instart+leftLength+1, inend);
    	}
    	return node;
    }

    public int leftLengthInOrder(int instart, int inend, int value, int[] inOrder){
    	int length = 0;
    	for(int i=instart;i<=inend&&inOrder[i]!=value;i++){
    		length++;
		}
    	return length;
	}
}
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页