代码随想录算法训练营Day27|二叉树part08

80 阅读3分钟

LeetCode 669 修剪二叉搜索树

题目链接:leetcode.cn/problems/tr…

文档讲解:programmercarl.com/0669.修剪二叉搜索…

视频讲解:www.bilibili.com/video/BV17P…

思路

考虑递归三要素:

  1. 递归函数的参数和返回值 参数:根节点,修建范围 返回值:修剪后的根节点
  2. 递归函数的结束条件 如果根节点为空,返回根节点
  3. 单层递归逻辑 如果根节点在区间左侧,那么左子树所有节点都被舍弃,故递归修剪右子树并返回递归结果 如果根节点在区间右侧,递归修剪左子树并返回递归结果 如果根节点在区间内,对左右子树分别递归修剪,返回值用于更新根节点的左右子节点,返回根节点

解法

class Solution {
	public TreeNode trimBST(TreeNode root, int low, int high) {	
		if (root == null) {		
			return null;		
		}		
		if (root.val < low) {		
			return trimBST(root.right, low, high);		
		}		
		else if (root.val > high) {		
			return trimBST(root.left, low, high);		
		}		
		else {		
			root.left = trimBST(root.left, low, high);			
			root.right = trimBST(root.right, low, high);		
		}		
		return root;	
	}
}

LeetCode 108 将有序数组转换为二叉搜索树

题目链接:leetcode.cn/problems/co…

文档讲解:programmercarl.com/0108.将有序数组转…

视频讲解:www.bilibili.com/video/BV1uR…

思路

高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 构造二叉树的关键在于找到分割点,为了让搜索树平衡,我们要选择数组中点作为分割点。

考虑递归三要素:

  1. 递归函数的参数和返回值 参数:有序数组左右索引left,right(左闭右开) 返回值:构造好的树根节点
  2. 递归函数的结束条件 如果left大于等于right,返回空
  3. 单层递归逻辑 计算中点mid,构造值为nums[mid]的根节点。 递归对[left, mid)构造,返回值作为左子树 递归对[mid+1, right)构造,返回值作为右子树 返回根节点

解法

class Solution {
	int[] nums;	
	
	public TreeNode sortedArrayToBST(int[] nums) {	
		this.nums = nums;		
		return traverse(0, nums.length);	
	}		  
	
	public TreeNode traverse(int left, int right) {	
		if (left >= right) {		
			return null;		
		}		
		int mid = (right - left) / 2 + left;		
		TreeNode root = new TreeNode(nums[mid]);		
		root.left = traverse(left, mid);		
		root.right = traverse(mid+1, right);		
		return root;	
	}
}

LeetCode 538 把二叉搜索树转换为累加树

题目链接:leetcode.cn/problems/co…

文档讲解:programmercarl.com/0538.把二叉搜索树…

视频讲解:www.bilibili.com/video/BV1d4…

思路

累加树(Greater Sum Tree),每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。所以我们要从大到小累加搜索树的节点,故按照右-中-左的顺序遍历二叉树

考虑递归三要素:

  1. 递归函数的参数和返回值 参数:二叉搜索树根节点 返回值:累加树根节点 全局变量:sum,标识累加到的值
  2. 递归函数的结束条件 根节点为空,返回空
  3. 单层递归逻辑 对右子树递归,结果作为根节点的右子树 更新sum=sum+root.val 把根节点值更新为sum 对左子树递归调用,结果作为根节点的左子树 返回根节点

解法

class Solution {
	int sum = 0;	
	
	public TreeNode convertBST(TreeNode root) {		
		if (root == null) {		
			return null;		
		}		
		root.right = convertBST(root.right);		
		sum += root.val;		
		root.val = sum;		
		root.left = convertBST(root.left);		
		return root;	
	}
}

二叉树总结

二叉树总结.png

今日收获总结

今天1小时完成任务,二叉树最深的体会是,不知道怎么做就按照递归三要素考虑,慢慢地就抽丝剥茧做出来啦!