剑指offer:二叉搜索树的第k个结点
2016-05-05 15:56
204 查看
题目描述
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
递归
/* 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, unsigned int k) { if (pRoot == NULL || k == 0){ return NULL; } return helper(pRoot, k); } private: TreeNode* helper(TreeNode* pRoot, unsigned int& k){ TreeNode* res = NULL; if (pRoot->left){ // res=helper(pRoot->left, k); } if (pRoot){ if (res == NULL){ if (k == 1){ res = pRoot; } k--; } } //res==NULL就不用再递归 if (res==NULL && pRoot->right!=NULL){ // res=helper(pRoot->right, k); } return res; } };
非递归
/* 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, unsigned int k) { if (pRoot == NULL || k == 0){ return NULL; } stack<TreeNode*> stk; TreeNode* p = pRoot; int index = 0; TreeNode* res=NULL; while (p != NULL || !stk.empty()){ while (p){ stk.push(p); p = p->left; } //这里是if,不是while if (!stk.empty()){ p = stk.top(); stk.pop(); index++; if (index == k){ res = p; break; } //不用判断p->right是否为空 p = p->right; } } return res; } };
相关文章推荐
- XML与HTML的设计区别
- (礼拜四log)前端开发,使用jq的.css函数添加属性时!important要注意的问题
- inode
- 10个最好的 JavaScript 动画库和开发框架
- jquery ajax中使用jsonp的限制
- jQuery Mobile 和 Kendo UI 的比较
- 深入理解js promise chain
- React-Native的项目总结
- jQuery 获取屏幕高度、宽度
- javascript要点
- IOS 改变tabbar的样式
- Kettle的null与空字符串处理
- html5学习 一 html5选择器与json新方法html5拖拽
- [MySQL Reference Manual] 18 复制
- js的浅克隆和深度克隆
- 浅析 NodeJs 的几种文件路径
- 详解JavaScript中基于原型prototype的继承特性
- CSS控制文本超出指定宽度显示省略号和文本不换行效果的实现
- JS中关于clientWidth offsetWidth scrollWidth 等的含义
- angularjs中工具方法的学习和使用