【LeetCode算法学习笔记】二叉树 第二期

学习笔记,总结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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值