题解 | JZ54 二叉搜索树的第k个节点

把代码分成两个部分,一个是子部分用来统计数的结点个数。另一个是来算第k的位置。

先要算出左子树的所有结点的个数,然后加上1,才为当前的结点的位置。

向右子树走的时候,则需要k-左子树结点个数-1,向下进行搜索

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param proot TreeNode类 
     * @param k int整型 
     * @return int整型
     */
    int KthNode(TreeNode* proot, int k) {
        // write code here
        if (!proot) return -1;
        int left_tree = NodeCount(proot->left);
//         return left_tree;
        if (left_tree + 1 == k) {
            return proot->val;
        } 
        
        if (k < left_tree + 1) return KthNode(proot->left, k);
        return KthNode(proot->right, k - left_tree - 1);
        
    }
    
    int NodeCount(TreeNode* proot) {
        if (!proot) return 0;
        return NodeCount(proot->left) + NodeCount(proot->right) + 1;
    }
};
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param proot TreeNode类 
# @param k int整型 
# @return int整型
#
class Solution:
    def KthNode(self , proot: TreeNode, k: int) -> int:
        # write code here
        if proot is None:
            return -1
        
        left_tree = self.NodeCount(proot.left)
        if k == left_tree + 1:
            return proot.val
        if k < left_tree + 1:
            return self.KthNode(proot.left, k)
        return self.KthNode(proot.right, k - left_tree - 1)
    
    
    def NodeCount(self, proot: TreeNode) -> int:
        if proot is None:
            return 0
        return self.NodeCount(proot.left) + self.NodeCount(proot.right) + 1  
全部评论

相关推荐

给🐭🐭个面试机会吧:嘿,mvbatis
点赞 评论 收藏
分享
01-23 19:12
门头沟学院 Java
榨出爱国基因:你还差 0.1% 就拿到校招礼盒,快叫朋友给你砍一刀吧
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务