T108:将有序数组转换为二叉搜索树
题目要求:给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。
题目理解
输入一个升序数组nums
输出一棵"高度平衡"的二叉搜素树(BST)
核心思路
BST特点
左 < 根 < 右
所以我们必须
每次选中间元素当根节点
流程:
1️⃣ 找中点 mid
2️⃣ 创建 root = nums[mid]
3️⃣ 左子树 = build(left, mid-1)
4️⃣ 右子树 = build(mid+1, right)
代码实现
java
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return build(nums, 0, nums.length - 1);
}
private TreeNode build(int[] nums, int left, int right) {
// 终止条件
if (left > right) {
return null;
}
// 正确的中点
int mid = left + (right - left) / 2;
// 创建节点
TreeNode root = new TreeNode(nums[mid]);
// 左子树
root.left = build(nums, left, mid - 1);
// 右子树
root.right = build(nums, mid + 1, right);
return root;
}
}
}
本题感悟
- 掌握升深度搜素树的概念:左<根节点<右
- 深入递归思想
T98:验证搜索二叉树
题目要求 :
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 严格小于 当前节点的数。
节点的右子树只包含 严格大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
本质理解
BST定义
对于每个节点:
左子树所有节点 < 当前节点
右子树所有节点 > 当前节点
核心思路
中序遍历
BST 的中序遍历 = 严格递增序列
代码实现
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
long prev=Long.MIN_VALUE;//记录上一个值
public boolean isValidBST(TreeNode root) {
return inorder(root);
}
private boolean inorder(TreeNode node){
if(node==null){
return true;
}
//递归调用左子树
if(!inorder(node.left)){
return false;
}
//中(判断)
if(node.val<=prev){
return false;
}
prev=node.val;
//递归调用右子树
return inorder(node.right);
}
}
本题感悟
被二叉树递归绕的晕晕的