二叉搜索树(BST)
根节点大于等于左子树所有节点,小于等于右子树所有节点。
二叉搜索树中序遍历即为节点从小到大排序。
230. 二叉搜索树中第K小的元素
题目描述:
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例:
代码题解:
// 中序遍历
class Solution {
int cnt = 0;
int val;
public:
int kthSmallest(TreeNode* root, int k) {
kth(root, k);
return val;
}
void kth(TreeNode* root, int k) {
if (root == nullptr) return;
kth(root -> left, k); // 左
cnt++; // 记录是第几小
if (cnt == k) {
val = root -> val; // 根
return;
}
kth(root -> right, k); // 右
}
};
// 递归法
public int kthSmallest(TreeNode root, int k) {
int leftCnt = count(root.left);
if (leftCnt == k - 1) return root.val;
if (leftCnt > k - 1) return kthSmallest(root.left, k);
return kthSmallest(root.right, k - leftCnt - 1);
}
private int count(TreeNode node) {
if (node == null) return 0;
return 1 + count(node.left) + count(node.right);
}
235. 二叉搜索树的最近公共祖先
题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例:
代码题解:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
// 找左边
if (root -> val > p -> val && root -> val > q -> val) return lowestCommonAncestor(root -> left, p, q);
// 找右边
if (root -> val < p -> val && root -> val < q -> val) return lowestCommonAncestor(root -> right, p, q);
return root;
}
};
108. 将有序数组转换为二叉搜索树
题目描述:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例:
思路:
对于已经升序排列的数组,之后的根节点肯定是最中间元素,再增加两个参数来控制左子树节点和右子树节点。
代码题解:
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return toBST(nums, 0, nums.size() - 1);
}
TreeNode* toBST(vector<int>& nums, int l, int r) {
if (l > r) return nullptr;
int m = (l + r) / 2; // 先找到根节点
// 利用m填节点值
TreeNode* root = new TreeNode(nums[m]);
root -> left = toBST(nums, l, m-1); // m-1 从中间往左移
root -> right = toBST(nums, m+1, r); // m+1 从中间往右移
return root;
}
};