博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【剑指offer】54、二叉搜索树的第k大的节点
阅读量:5098 次
发布时间:2019-06-13

本文共 2543 字,大约阅读时间需要 8 分钟。

题目

给定一颗二叉搜索树,找出其中第k大的节点(从小到大),返回其节点

思路一

最朴素的想法,中序遍历就是二叉搜索树的递增序列,那直接写出整棵树的中序遍历即可

递归版本

class Solution {public:    TreeNode* KthNode(TreeNode* pRoot, int k)    {        if (!pRoot || k<=0)            return nullptr;        vector
in_order; InOrder(pRoot, in_order); if (k > in_order.size()) // 不加这句话会下标溢出 return nullptr; return in_order[k-1]; } void InOrder(TreeNode* pRoot, vector
& in_order){ if (pRoot == nullptr) return; InOrder(pRoot->left, in_order); in_order.push_back(pRoot); InOrder(pRoot->right, in_order); }};

同时也应该掌握非递归版本

class Solution {public:    TreeNode* KthNode(TreeNode* pRoot, int k)    {        if (!pRoot || k<=0)            return nullptr;        vector
in_order; stack
node; TreeNode* temp = pRoot; while (!node.empty() || temp) { if(temp) { node.push(temp); temp = temp->left; } else{ temp = node.top(); in_order.push_back(temp); node.pop(); temp = temp->right; } } if (k > in_order.size()) return nullptr; return in_order[k-1]; }};

 

思路二

我们只需得到从小到大的第k个数,没有必要全部遍历。根据中序的思想,可以用一个count计数

递归版本

class Solution {public:    int count = 0;    TreeNode* KthNode(TreeNode* pRoot, unsigned int k)    {        if(pRoot){             TreeNode* res = KthNode(pRoot->left, k);            if(res)                return res;            count++;            if(count == k)                return pRoot;            res = KthNode(pRoot->right,k);            if(res)                return res;        }        return nullptr;    }};

同样只需修改非递归版本的中序遍历即可,每次压入vec时相当于找到一个节点,此时count++即可

class Solution {public:    TreeNode* KthNode(TreeNode* pRoot, int k)    {        if (!pRoot || k<=0)            return nullptr;        int count = 0;        stack
node; TreeNode* temp = pRoot; while (!node.empty() || temp) { if(temp) { node.push(temp); temp = temp->left; } else{ temp = node.top(); count++; if (count == k) //修改这部分就可以,而且非常好理解 return temp; node.pop(); temp = temp->right; } } return nullptr; }};

 

转载于:https://www.cnblogs.com/shiganquan/p/9350141.html

你可能感兴趣的文章
hdu 4451水题
查看>>
博客作业2---线性表
查看>>
右击main 方法运行正常,启动tomcat 后,spring boot 项目 出现参数字符串是乱码的情况...
查看>>
javascript朝花夕拾
查看>>
20135335郝爽 & 20135304刘世鹏 实验一
查看>>
多行文本省略号的实现.html
查看>>
写枚举常量
查看>>
[POJ 1004] Financial Management C++解题
查看>>
Oracle基础进阶
查看>>
第一篇随笔, 正在做 ESP32 , STM32 , 树莓派 RaspberryPi 的创客工具
查看>>
电商路演
查看>>
Code Review 转自伯乐在线
查看>>
Pandas plot出图
查看>>
T-SQL 随机返回特定行数据和分页查询
查看>>
SpringBoot2.0之整合Kafka
查看>>
使用 Override 和 New 关键字进行版本控制
查看>>
安装Ubuntu的那些事儿
查看>>
Safari导入书签
查看>>
wordpress如何去掉generator
查看>>
UVA 167 The Sultan's Successors
查看>>