刷题神器
代码随想录
往期回顾
>【二叉树】|代码随想录算法训练营第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的返回值的意义
二叉树总结
二叉树的理论基础
二叉树的种类、存储方式、遍历方式、定义方式
二叉树的遍历方式
深度优先遍历,前中后序
广度优先遍历,通过队列模拟