响应 网站建设,毕业答辩ppt模板免费下载网站,交换友情链接的要求有,wordpress网站空间给定两个整数数组 preorder 和 inorder #xff0c;其中 preorder 是二叉树的先序遍历#xff0c; inorder 是同一棵树的中序遍历#xff0c;请构造二叉树并返回其根节点。 思路#xff1a;题目给出了先序遍历和中序遍历的结果#xff0c;因为先序遍历遵循根–左–其中 preorder 是二叉树的先序遍历 inorder 是同一棵树的中序遍历请构造二叉树并返回其根节点。 思路题目给出了先序遍历和中序遍历的结果因为先序遍历遵循根–左–右而中序遍历遵循左–根–右。所以先序第一个元素必定为根节点我们可以对中序数组构建一个哈希表用于存放每个元素的索引值然后在中序找到根节点所在的索引。这样就可以知道左子树和右子树的数目以及左子树和右子树的前序和中序遍历结果最后可以使用递归方法构造出左子树和右子树再将这两颗子树接到根节点的左右位置。
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val val;* this.left left;* this.right right;* }* }*/
class Solution {private MapInteger,Integer indexMap;public TreeNode myBUildTree(int[] preorder,int [] inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right){if(preorder_leftpreorder_right){return null;}int preorder_root preorder_left;int inorder_root indexMap.get(preorder[preorder_root]);TreeNode root new TreeNode(preorder[preorder_root]);int size_left_subtree inorder_root - inorder_left;//前序遍历中第一个元素为根元素所以需要加1才开始是左子树root.left myBUildTree(preorder,inorder,preorder_left1,preorder_leftsize_left_subtree,inorder_left,inorder_root-1);root.right myBUildTree(preorder,inorder,preorder_leftsize_left_subtree1,preorder_right,inorder_root1,inorder_right);return root;}public TreeNode buildTree(int[] preorder, int[] inorder) {int n preorder.length;indexMap new HashMapInteger,Integer();for(int i0;in;i){indexMap.put(inorder[i],i);}return myBUildTree(preorder,inorder,0,n-1,0,n-1);}
}解释一下构造左、右子树的代码
root.left myBUildTree(preorder,inorder,preorder_left1,preorder_leftsize_left_subtree,inorder_left,inorder_root-1);root.right myBUildTree(preorder,inorder,preorder_leftsize_left_subtree1,preorder_right,inorder_root1,inorder_right);构造左子树
先序遍历中「从 左边界1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素 构造右子树
先序遍历中「从 左边界1左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位1 到 右边界」的元素