669. 修剪二叉搜索树
题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/
文档讲解:https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
视频讲解:https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
思路
- 如果当前节点的值小于最小值,那么将该节点的右节点进行递归(不直接返回右节点的原因是有可能右节点的左节点也小于最小值,还需要递归判断。)
- 同理,如果当前节点的值大于最大值,那么将还节点的左节点进行递归。
- 然后处理当前节点的左子树和右子树,在最后返回当前节点。
代码
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.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
108.将有序数组转换为二叉搜索树
题目链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/
文档讲解:https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2…
视频讲解:https://www.bilibili.com/video/BV1uR4y1X7qL
思路
- 每次构造树的时候将数组中间的值作为中间节点。
- 注意遵循左闭右闭或左闭右开原则。
代码
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return buildBST(nums, 0, nums.length);
}
public TreeNode buildBST(int[] nums, int left, int right) { // 左闭右开
if (left >= right) return null;
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = buildBST(nums, left, mid);
root.right = buildBST(nums, mid + 1, right);
return root;
}
}
538.把二叉搜索树转换为累加树
题目链接:https://leetcode.cn/problems/convert-bst-to-greater-tree/
文档讲解:https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC…
视频讲解:https://www.bilibili.com/video/BV1d44y1f7wP
思路
- 把这道题相成是有序数组从大到小的累加。
- 对于二叉搜索树,中序遍历(左中右)的结果是从小到大的数组,所以本题的遍历顺序是右中左。
代码
class Solution {
int pre = 0; // pre只需要记录前一个节点的值用作累加就可以了
public TreeNode convertBST(TreeNode root) {
getConvertBST(root);
return root;
}
public void getConvertBST (TreeNode root) {
if (root == null) return;
// 右
getConvertBST(root.right);
// 中
root.val += pre;
pre = root.val;
// 左
getConvertBST(root.left);
}
}
二叉树部分总结
文章链接:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html
二叉树题型的大体分类:
- 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
- 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
- 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。
1544

被折叠的 条评论
为什么被折叠?



