<剑指Offer>面试题54: 二叉搜索树的第 K 大节点

题目描述

  • 给定一颗二叉搜索树,请找出其中第 k 大的节点
  • 例如,在下图中所示二叉搜索树中,按节点数值大小顺序,第三大节点的值是 4

题目解读

代码

class Solution {
public:
    int count = 0;

    TreeNode* KthNode(TreeNode* pRoot, int k)
    {
        if(pRoot){
            TreeNode *node = KthNode(pRoot -> left, k);
            if(node){
                return node;
            }

            count ++;
            if(count == k){
                return pRoot;
            }

            node = KthNode(pRoot -> right, k);
            if(node){
                return node;
            }
        }   
        return NULL; 
    } 
};

总结展望

  • 关于这道题,重点讲解一下,不知道是因为最近因为开题,十天半个月没刷题还是咋的,感觉思维特迟钝,这道题竟然思考了一个晚上加一个上午,愣是刚才茅塞顿开才搞定,所以刷题大业要持之以恒,不可荒废啊
  • 这道题目是应用二叉树的中序遍历来做的,啥是中序遍历呢,简言之就是依次遍历左孩子,根节点,右孩子,然后递归执行,遍历即可,但是呢,这又可一般的中序遍历不一样,像我们一般用递归中序遍历,直接无返回值,直接递归四行代码即可,现在要返回值,它要是第k大的那个节点,注意不知节点值,是节点。
  • 这就很尴尬了,要节点,不要节点值,所以呢,我们要返回值,要判断返回值,感觉有种只可意会不可言传的感觉,语言真是不好描述,提醒几点吧。
    • 第一,代码中的 return NIULL;这句话无论 if 是否执行,这句是肯定要执行的,所以呢,只要返回不是第 K 大节点,这句话都会执行
    • 第二,if(node) return node,这句话用来依次向上一级返回第 K 大节点。只有在返回第 K 大节点时候才会执行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容