构造二叉树
106. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
public TreeNode buildTree(int[] inorder, int[] postorder) {
return build(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
}
private TreeNode build(int[] inorder,int L1,int R1,int[] postorder,int L2,int R2){
if(L1>R1){
return null;
}
//only one element
if(L1==R1){
return new TreeNode(inorder[L1]);
}
TreeNode head=new TreeNode(postorder[R2]);
//find index
int index=0;
for(int i=L1;i<=R1;i++){
if(inorder[i]==postorder[R2]){
index=i;
}
}
head.left=build(inorder,L1,index-1,postorder,L2,L2+index-L1-1);//0+0. 1-0
head.right=build(inorder,index+1,R1,postorder,L2+index-L1,R2-1);
return head;
}
105. 从前序与中序遍历序列构造二叉树
给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder==null || inorder==null || preorder.length!=inorder.length){
return null;
}
return build(inorder,0,inorder.length-1,preorder,0,preorder.length-1);
}
/**
* preOrder[L1...R1]
* inOrder[L2...R2]
*preOrder[L1]-->rootVal. inOrder->index
*
*/
private TreeNode build(int[] inorder,int L1,int R1,int[] preorder,int L2,int R2){
if(L1>R1){
return null;
}
if(L1==R1){
return new TreeNode(inorder[L1]);
}
int rootVal=preorder[L2];
TreeNode head=new TreeNode(rootVal);
int index=0;
for(int i=L1;i<=R1;i++){
if(rootVal==inorder[i]){
index=i;//1
}
}
head.left=build(inorder,L1,index-1,preorder,L2+1,L2+index-L1);
head.right=build(inorder,index+1,R1,preorder,L2+index-L1+1,R2);
return head;
}
1008. 前序遍历构造二叉搜索树
返回与给定前序遍历 preorder 相匹配的二叉搜索树(binary search tree)的根结点。
(回想一下,二叉搜索树是二叉树的一种,其每个节点都满足以下规则,对于 node.left 的任何后代,值总 < node.val,而 node.right 的任何后代,值总 > node.val。此外,前序遍历首先显示节点 node 的值,然后遍历 node.left,接着遍历 node.right。)
题目保证,对于给定的测试用例,总能找到满足要求的二叉搜索树。
示例:
输入:[8,5,1,7,10,12]
输出:[8,5,10,1,7,null,12]

class Solution {
public TreeNode bstFromPreorder(int[] preorder) {
if(preorder==null){
return null;
}
return build(preorder,0,preorder.length-1);
}
public TreeNode build(int[] preorder,int L,int R){
if(L>R){
return null;
}
if(L==R){
return new TreeNode(preorder[L]);
}
int less=L;
for(int i=L+1;i<=R;i++){
if(preorder[i]<preorder[L]){
less=i;
}
}
TreeNode head=new TreeNode(preorder[L]);
head.left=build(preorder,L+1,less);
head.right=build(preorder,less+1,R);
return head;
}
}
654. 最大二叉树
给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:
二叉树的根是数组 nums 中的最大元素。
左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。
返回有给定数组 nums 构建的 最大二叉树 。
示例 1:

public TreeNode constructMaximumBinaryTree(int[] nums) {
//arr[L..R] findMax ->index head
//arr[L..index-1] findMax head.left
//arr[index+1..R] findMax head.right
return build(nums,0,nums.length-1);
}
private TreeNode build(int[] nums,int L,int R){
if(L>R){
return null;
}
if(L==R){
return new TreeNode(nums[L]);
}
int index=findMaxValueIndex(nums,L,R);
TreeNode head=new TreeNode(nums[index]);
head.left=build(nums,L,index-1);
head.right=build(nums,index+1,R);
return head;
}
private int findMaxValueIndex(int[] nums,int L,int R){
int max=nums[L];
int index=L;
for(int i=L+1;i<=R;i++){
if(max<nums[i]){
max=nums[i];
index=i;
}
}
return index;
}
617. 合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:

注意: 合并必须从两个树的根节点开始。
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
return merge(root1,root2);
}
private TreeNode merge(TreeNode root1,TreeNode root2){
if(root1==null && root2==null){
return null;
}
if(root1==null){
return root2;
}
if(root2==null){
return root1;
}
TreeNode head=new TreeNode(root1.val+root2.val);
head.left=merge(root1.left,root2.left);
head.right=merge(root1.right,root2.right);
return head;
}

浙公网安备 33010602011771号