目录
二叉树09
LeetCode669 修建二叉搜索树
思路:用递归函数的返回值来移除节点非常方便
这里的单层递归逻辑是:后序遍历(左右中)自底向上,左边符合条件的节点接入root.left,右边符合条件的节点接入root.right,最终返回修剪过的树的root(因此前面还必须先找到符合条件的节点,就利用递归函数的返回值,相当于是上一层返回值传给这一层)。
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);
}
if (root.val > high) {
return trimBST(root.left, low, high);
}
// root在[low,high]范围内
root.left = trimBST(root.left, low, high); //root.left接入符合条件的左孩子
root.right = trimBST(root.right, low, high); //root.right接入符合条件的右孩子
return root;
}
}
LeetCode108 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
删除和插入/增加二叉树节点,都是用递归函数的返回值来完成,这样是比较方便的。
这里也用递归函数的返回值来构造节点的左右孩子(熟悉不?!)
思路:首先找到根节点,即中间值mid = left+(right-left)/2,不断从中间(左闭右闭比较方便)
递归三部曲:①传入参数,数组leftright;返回函数Treenode②终止条件:left>right③单层循环:新创建节点,添加左右子树
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode root = traversal(nums, 0, nums.length - 1);
return root;
}
// 左闭右闭区间[left, right]
private TreeNode traversal(int[] nums, int left, int right) {
if (left > right) return null;
int mid = left + ((right - left) >> 1);
TreeNode root = new TreeNode(nums[mid]);
root.left = traversal(nums, left, mid - 1);
root.right = traversal(nums, mid + 1, right);
return root;
}
}
LeetCode538 把二叉搜索树转换为累加树
思路:这个累加树显然用了右中左的逆序累加顺序,我们也可以用右中左(反中序遍历),然后顺序累加;既然是累加(或者比较),都需要用到前一个节点的数值pre(int类型),且要记得更新全局变量pre。
这道题没有更改树的结构,只是改变了值
class Solution {
int pre; //用于记录前一个节点数值
public TreeNode convertBST(TreeNode root) {
pre = 0;
traversal(root);
return root;
}
public void traversal(TreeNode root){
if(root == null) return;
traversal(root.right);
pre += root.val;
root.val = pre;
traversal(root.left);
}
}
终于结束啦!!!接下来就是总结!!!!!