【剑指Offer】面试题63:二叉搜索树的第k个结点
来源:互联网 发布:民间融资数据 编辑:程序博客网 时间:2024/06/10 10:34
一:题目描述
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4
二:解题思路
二叉搜索树特点:左子结点的值小于根节点,根节点小于右子节点的值
按照中序遍历二叉搜索树,可以得到一个排序好的序列,第k个值就是我们要找的
三:代码实现
//非递归实现
/*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) { //非递归实现 //二叉搜索树特点:左子结点的值小于根节点,根节点小于右子节点的值 //按照中序遍历二叉搜索树,可以得到一个排序好的序列,第k个值就是我们要找的 if(pRoot==NULL || k<=0) return NULL; TreeNode* pNode=pRoot; int currentNum=0; stack<TreeNode* > stackTree; stackTree.push(pNode); //将树的最左侧全部压栈,此时的栈顶元素是整棵树的最小值 while(pNode->left!=NULL){ stackTree.push(pNode->left); pNode=pNode->left; } while(!stackTree.empty()){ pNode=stackTree.top(); stackTree.pop(); currentNum++; if(currentNum==k) return pNode; if(pNode->right!=NULL){ stackTree.push(pNode->right); //注意了,很重要,很重要,很重要! //将pNode->right根节点最左侧全部压栈 //保证栈顶元素是当前最小值 pNode=pNode->right; while(pNode->left!=NULL){ stackTree.push(pNode->left); pNode=pNode->left; }//while }//if }//while //如果n的大小大于二叉树的所有结点数 return NULL; }};
递归版(不容易理解-还没有参透)
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: int index=0;//计数器 TreeNode* KthNode(TreeNode* pRoot, int k) { //递归实现 if(pRoot!=NULL){ //找到root最左子结点 TreeNode* pNode=KthNode(pRoot->left,k); if(pNode!=NULL) return pNode; index++; if(index==k) return pRoot; pNode=KthNode(pRoot->right,k); if(pNode!=NULL) return pNode; } return NULL; }};
阅读全文
0 0
- 《剑指Offer》学习笔记--面试题63:二叉搜索树的第k个结点
- 【剑指Offer学习】【面试题63:二叉搜索树的第k个结点】
- 剑指offer-面试题63:二叉搜索树的第K个结点
- 《剑指offer》面试题63 二叉搜索树的第k个结点
- 剑指offer--面试题63:二叉搜索树的第k个结点
- 剑指offer-面试题63-二叉搜索树的第k个结点
- 剑指offer 面试题63 二叉搜索树的第 k 个结点
- 剑指offer面试题63 二叉搜索树的第k个结点
- 【剑指Offer】面试题63:二叉搜索树的第k个结点
- 剑指offer 面试题63 二叉搜索树的第 k 个结点
- 剑指offer 面试题63:二叉搜索树的第k个结点(二叉树中序遍历的应用) 题解
- 《剑指offer》二叉搜索树的第k个结点
- 剑指offer:二叉搜索树的第k个结点
- [剑指offer]二叉搜索树的第k个结点
- 剑指offer-二叉搜索树的第k个结点
- 【剑指Offer】二叉搜索树的第k个结点
- 剑指offer 二叉搜索树的第k个结点
- 剑指Offer:二叉搜索树的第K个结点
- Idea git打tag
- memcached简介(转)
- 数字证书原理
- 博弈论
- JS获取当前时间,时间与时间戳之间的转换
- 【剑指Offer】面试题63:二叉搜索树的第k个结点
- 21. Merge Two Sorted Lists
- 溢出与类型提升
- Storm并行度
- 在linux下如何将文件夹打包
- Unity 日志文件的存放
- Makefile详解(二)
- Linux下memcache的安装和启动(转)
- 基于表的mybatis代码自动生成