刷题神器
往期回顾
>【二叉树】|代码随想录算法训练营第17天|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
题目
669. 修剪二叉搜索树
-
学后思路
修剪二叉树和删除二叉树有一些相似但是有特殊处理的地方,需要注意处理节点和左右子树
解法1:
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return null;
// 注意其右子树有可能有符合区间的值
if(root.val < low){
TreeNode right = trimBST(root.right, low, high);
return right;
}
// 注意其左子树有可能有符合区间的值
if(root.val > high){
TreeNode left = trimBST(root.left,low, high);
return left;
}
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
- 题目总结
- 处理小于或大于区间的时候要考虑其左右子树的合理性,二叉搜索树的左右子树有可能有符合条件的值
108.将有序数组转换为二叉搜索树
- 学后思路
将有序数组构建二叉搜索树,要求是平衡二叉树,平衡二叉树,取中间节点,保证左右子树的高度
解法一:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if (nums.length == 1)
return new TreeNode(nums[0]);
int mid = nums.length / 2;
TreeNode root = new TreeNode(nums[mid]);
if (mid > 0) {
root.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, mid));
}
if (mid < nums.length - 1) {
root.right = sortedArrayToBST(Arrays.copyOfRange(nums, mid + 1, nums.length));
}
return root;
}
}
- 题目总结
- 注意结束条件的判断,注意区间取值的判断
- 注意数组如何copy Arrays.copyOfRange
538.把二叉搜索树转换为累加树
- 学后思路
有序数组,从后往前遍历,搜索树,递增,左中右,如果想要递加,反过来,右中左,
解法一:
class Solution {
int pre = 0;
public TreeNode convertBST(TreeNode root) {
if(root == null) return root;
convertBST(root.right);
root.val = root.val + pre;
pre = root.val;
convertBST(root.left);
return root;
}
}
- 题目总结
- 注意pre指针的作用
- 注意convert的返回值的意义
二叉树总结
二叉树的理论基础
二叉树的种类、存储方式、遍历方式、定义方式
二叉树的遍历方式
深度优先遍历,前中后序
广度优先遍历,通过队列模拟