LeetCode 669 修剪二叉搜索树
思路
考虑递归三要素:
- 递归函数的参数和返回值 参数:根节点,修建范围 返回值:修剪后的根节点
- 递归函数的结束条件 如果根节点为空,返回根节点
- 单层递归逻辑 如果根节点在区间左侧,那么左子树所有节点都被舍弃,故递归修剪右子树并返回递归结果 如果根节点在区间右侧,递归修剪左子树并返回递归结果 如果根节点在区间内,对左右子树分别递归修剪,返回值用于更新根节点的左右子节点,返回根节点
解法
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 将有序数组转换为二叉搜索树
思路
高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 构造二叉树的关键在于找到分割点,为了让搜索树平衡,我们要选择数组中点作为分割点。
考虑递归三要素:
- 递归函数的参数和返回值 参数:有序数组左右索引left,right(左闭右开) 返回值:构造好的树根节点
- 递归函数的结束条件 如果left大于等于right,返回空
- 单层递归逻辑
计算中点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 把二叉搜索树转换为累加树
思路
累加树(Greater Sum Tree),每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。所以我们要从大到小累加搜索树的节点,故按照右-中-左的顺序遍历二叉树
考虑递归三要素:
- 递归函数的参数和返回值 参数:二叉搜索树根节点 返回值:累加树根节点 全局变量:sum,标识累加到的值
- 递归函数的结束条件 根节点为空,返回空
- 单层递归逻辑 对右子树递归,结果作为根节点的右子树 更新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;
}
}
二叉树总结
今日收获总结
今天1小时完成任务,二叉树最深的体会是,不知道怎么做就按照递归三要素考虑,慢慢地就抽丝剥茧做出来啦!