Leetcode每日一题6.05:二叉树搜索树BST

二叉搜索树(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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值