LeetCode--面试题07. 重建二叉树(java)

在这里插入图片描述
——————————————————————————————————————————————————
参考的大佬题解
用 inMap 记录中序遍历中各元素及其下标,可以快速获取根节点在中序数组的下标
在这里插入图片描述
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 class Solution {
	Map<Integer, Integer> inMap = new HashMap<>();
	int[] preArr;
	int[] inArr;
	int len;
	
	public TreeNode buildTree(int[] preorder, int[] inorder) {
		preArr = preorder;//改成全局变量,这样helper的参数可以少一些
		inArr = inorder;
		len = inorder.length;
		for(int i = 0;i < len;i++) inMap.put(inorder[i], i);
		TreeNode tree = helper(0, 0, len - 1);
		return tree;
	}
	/**
	 * 
	 * @param pre_root 当前二叉树根节点在前序数组的索引
	 * @param in_left 当前二叉树在中序数组的左边界
	 * @param in_right 当前二叉树在中序数组的右边界
	 * @return
	 */
	private TreeNode helper(int pre_root, int in_left, int in_right) {
		if(in_left > in_right) return null;
		TreeNode root = new TreeNode(preArr[pre_root]);
		Integer i = inMap.get(preArr[pre_root]);//根节点在中序数组的索引
		root.left = helper(pre_root + 1, in_left, i - 1);
		//i-in_left就是左子树的长度,根节点往右移i - in_left + 1次就是右子树根节点在前序数组的索引
		root.right = helper(pre_root + i - in_left + 1, i + 1, in_right);
		return root;
	}
}
发布了177 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/105724786