一、前言
本系列文章为《剑指Offer》刷题笔记。
刷题平台:牛客网
书籍下载:共享资源
二、题目
给定一颗二叉搜索树,请找出其中的第k大的结点。例如,在下图中,按结点数值大小顺序第三个结点的值为4。
这棵树是二叉搜索树,首先想到的是二叉搜索树的一个特点:左子结点的值 < 根结点的值 < 右子结点的值。
1、思路
如上图所示,如果使用终须遍历,则得到的序列式为{2,3,4,5,6,7,8}。因此,只需要用中序遍历一棵二叉搜索树,就很容易找出它的第k大结点。
2、代码
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: TreeNode* KthNode(TreeNode* pRoot, int k) { if(pRoot == NULL || k == 0){ return NULL; } return KthNodeCore(pRoot, k); } private: TreeNode* KthNodeCore(TreeNode* pRoot, int &k){ TreeNode* target = NULL; // 先遍历左结点 if(pRoot->left != NULL){ target = KthNodeCore(pRoot->left, k); } // 如果没有找到target,则继续减小k,如果k等于1,说明到了第k大的数 if(target == NULL){ if(k == 1){ target = pRoot; } k--; } // 如果没有找到target,继续找右结点 if(pRoot->right != NULL && target == NULL){ target = KthNodeCore(pRoot->right, k); } return target; } }; |
微信公众号
分享技术,乐享生活:微信公众号搜索「JackCui-AI」关注一个在互联网摸爬滚打的潜行者。
2018年10月6日 下午4:56 沙发
我觉得二叉树又难又简单。。。。
2018年10月6日 下午5:01 1层
@卷卷 you need 手把手教学。
2018年11月20日 下午7:25 板凳
大神,18行的调用,与21行的定义,参数k不一样呢?
2018年11月20日 下午7:27 1层
@大敏 哪里不一样?一样的吧。
2018年11月20日 下午10:13 地板
大神,我仔细看了一下,k如果是各个递归中都要用到的话,应该传指针才对;如果那样的话,29,32行应该是对*k进行判断和操作才对吧
2018年11月20日 下午10:16 1层
@大敏 哦,你是说这个k这里啊,这个用引用和指针都是可以的,两种操作方法而已。
2018年11月21日 上午8:08 2层
@Jack Cui 原来是引用,我没有使用过引用,大神提醒才想起,感谢感谢
2020年3月19日 下午3:40 4楼
你好,你这个解法写错了吧,按照题目的要求,第k大应该是中序的逆序,所以应该先遍历左子树,然后遍历右子树。