关闭

[置顶] 从大到小输出二叉搜索树中键值不小于K的关键字

标签: 数据结构二叉搜索树二叉排序树
668人阅读 评论(2) 收藏 举报
分类:

概要

这是王道数据结构复习资料上的一道题。该书给出了递归算法,但是解析中对于非递归算法说使用非递归中序遍历的思路进行解答,这明显有错误。根据 二叉搜索树的性质可知,二叉搜索树的中序遍历是从小到大的序列,但是题意却是要从大到小输出,故需要采用右根左的遍历方式才能得到题意所要求的序列。


算法如下:

void FindK(BinarySearchTree* BST , int k){
    stack<BinarySearchTree*> stack;                                   //初始化栈 
        BinarySearchTree* binary_tree_curr = BST;                           //保存当前结点 
        while(binary_tree_curr || !stack.empty()){
              if(binary_tree_curr->rchild){                           //右孩子非空
                stack.push(binary_tree_curr);                       //当前结点入栈 
                binary_tree_curr = binary_tree_curr->rchild;        //遍历右子树 
              }else{
                 //右孩子为空,则打印当前结点遍历左子树 
                 if(binary_tree_curr->data >= k){
                    cout<<binary_tree_curr->data<<" ";                      
         } 
                 binary_tree_curr = binary_tree_curr->lchild;
                 //如果为空,且栈不空,则将栈顶节点出栈,并输出该节点,  
                 //同时将它的左孩子设为当前节点,继续判断,直到当前节点不为空   
                 while(!binary_tree_curr && !stack.empty()){
                      binary_tree_curr = stack.top();
                      if(binary_tree_curr->data >= k){
                        cout<<binary_tree_curr->data<<" ";                      
              } 
                      stack.pop();
                      binary_tree_curr = binary_tree_curr->lchild;
                 }
              }
        }
} 

截图如下:
这里写图片描述
对于二叉排序树的完整代码如下请移步我的另外一篇博客:
http://blog.csdn.net/qq_30091945/article/details/77720865
对于二叉树的递归遍历与非递归遍历请移步:
http://blog.csdn.net/qq_30091945/article/details/77531651

0
0
查看评论

二叉搜索树的第k个结点(二叉搜索树结点查找)

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。   二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列...
  • You_are_my_dream
  • You_are_my_dream
  • 2017-01-28 17:59
  • 484

从大到小输出二叉搜索树中键值不小于K的关键字

概要这是王道数据结构复习资料上的一道题。该书给出了递归算法,但是解析中对于非递归算法说使用非递归中序遍历的思路进行解答,这明显有错误。根据 二叉搜索树的性质可知,二叉搜索树的中序遍历是从小到大的序列,但是题意却是要从大到小输出,故需要采用右根左的遍历方式才能得到题意所要求的序列。算法如下:void ...
  • qq_30091945
  • qq_30091945
  • 2017-09-03 10:44
  • 668

MIT:算法导论——9.二叉搜索树

====================博客补充====================================================
  • loveprogram_1
  • loveprogram_1
  • 2014-06-12 10:57
  • 540

ch09_ex33&nbsp;从大到小输出给定二叉排…

9.33③ 编写递归算法,从大到小输出给定二叉排序树 中所有关键字不小于x的数据元素。要求你的算法的时 间复杂度为O(log2n+m),其中n为排序树中所含结点数, m为输出的关键字个数。 实现下列函数: void OrderOut(BiTree t, KeyType x, void(*visit...
  • jingzhewangzi
  • jingzhewangzi
  • 2014-08-29 22:26
  • 873

二叉搜索树中找出比K大的最小的那个数

这是一道面试的算法题,题目不难,但是在面试的时候是要求直接在白板上写程序,感觉自己还是弱爆了。第一次体验这种面试方式,虽然被虐,但是感觉还是挺好的,这方面的经验还是需要积累。题目: 在一个二叉搜索树种查找比某个数(K)大数中最小的那个。先把二叉树相关的构造代码贴上,下面是二叉树的节点定义。/** *...
  • wangbingcsu
  • wangbingcsu
  • 2016-04-24 21:00
  • 1699

不同的二叉查找树

给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 您在真实的面试中是否遇到过这个题?  Yes 样例 给出n = 3,有5种不同形态的二叉查找树: 1 3 3 2 ...
  • fk5431
  • fk5431
  • 2016-01-06 18:22
  • 710

二叉查找树

二叉查找树定义、功能以及C语言实现
  • peisir
  • peisir
  • 2017-02-20 17:49
  • 143

求一个二叉搜索树中第K个最小值

假设该颗二叉搜索树的总元素数大于等于K解题思路:用STL容器的栈来实现int kthSmallest(TreeNode* root, int k) { std::stack<TreeNode*> Stack; while (root || !Stack.empty())...
  • u011859369
  • u011859369
  • 2015-07-14 22:51
  • 335

剑指offer(64):二叉搜索树的第k大的节点

题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。
  • u011080472
  • u011080472
  • 2016-05-01 16:53
  • 1286

【算法学习】最优二叉查找树(动态规划)

一、什么是最优二叉查找树 最优二叉查找树: 给定n个互异的关键字组成的序列K=,且关键字有序(k1 图一显示了给定上面的概率分布pi、qi,生成的两个二叉查找树的例子。图二就是在这种情况下一棵最优二叉查找树。 概率分布: i ...
  • lovely_girl1126
  • lovely_girl1126
  • 2016-10-31 20:18
  • 217
    个人资料
    • 访问:155567次
    • 积分:4927
    • 等级:
    • 排名:第6843名
    • 原创:329篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论