学习笔记,总结labuladong公众号文章,方便自己以后更好的理解和学习!!!
是个人的学习笔记记录,是个人的学习笔记记录,是个人的学习笔记记录。
强烈推荐labuladong公众号进行学习
关键思路:先把题目的要求细化,搞清楚根节点应该做什么,然后剩下的事情抛给前/中/后序的遍历框架就可以了。
构造最大二叉树(654)
首先找到最大值,然后套用框架。
public TreeNode constructMaximumBinaryTree(int[] nums){
return build(nums,0,nums.length-1);
}
public TreeNode build(int[] nums,int lo,int hi){
if(lo>hi) return null;
//找到数组中最大元素的下标和值
int index=-1,maxVal=Integer.MIN_VALUE;
for(int i=lo;i<hi;i++){
if(maxVal<nums[i]){
index=i;
maxVal=nums[i];
}
}
TreeNode root=new TreeNode(maxVal);
root.left=build(nums,lo,index-1);
root.right=build(nums,index+1,hi);
return root;
}
通过前序遍历和后序遍历构造二叉树(105)
根节点就是前序遍历的第一个节点,关键在于如何通过根结点的值将后序遍历的数组划分成两半,构造左右子树。
public TreeNode buildTree(int[] preorder,int[] inorder){
return build(preorder,0,preorder.length,inorder,0,inorder.length);
}
public TreeNode build(int[] preorder,int preStart,int preEnd,int[] inorder,int inStart,int inEnd){
if(preStart>preEnd) return null;
int rootVal=preorder[preStart];
int index=0;
for(int i=inStart;i<=inEnd;i++){
if(rootVal==inorder[i]){
index=i;break;
}
}
int leftSize=index-inStart;
TreeNode root=new TreeNode(rootVal);
root.left=build(preorder,preStart+1,preStart+leftSize,inorder,inStart,index-1);
root.right=build(preorder,preStart+leftSize+1,preEnd,inorder,index+1,inEnd);
return root;
}
通过后序和中序遍历
跟上一题一样,唯一的差别就在于根是在后序遍历的最后。
public TreeNode buildTree(int[] postorder,int[] inorder){
return build(postorder,0,postorder.length,inorder,0,inorder.length);
}
public TreeNode build(int[] postorder,int postStart,int postEnd,int[] inorder,int inStart,int inEnd){
if(inStart>inEnd) return null;
int rootVal=postorder[postEnd];
int index=0;
for(int i=inStart;i<=inEnd;i++){
if(rootVal==inorder[i]){
index=i;break;
}
}
int leftSize=index-inStart;
TreeNode root=new TreeNode(rootVal);
root.left=build(postorder,postStart,postStart+leftSize-1,inorder,inStart,index-1);
root.right=build(postorder,postStart+leftSize,postEnd-1,inorder,index+1,inEnd);
return root;
}