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

原创 2017年09月03日 10:44:50

概要

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


算法如下:

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

版权声明:本文为博主原创文章,未经博主允许不得转载。若需转载,请注明http://blog.csdn.net/qq_30091945 举报

相关文章推荐

概念堆是一个用数组表示的完全二叉树,并满足以下两个特性: 1)父节点的键值总是大于或等于(小于等于)其子树上的任意结点 2)每个结点的左子树和右子树都是个堆。 如果父节点的键值总是大于等于任何一...

local function definitions are illegal解决办法

原文出处http://wenku.baidu.com/view/1f3eb740c850ad02de8041ac.html 编译错误:local function definitions are i...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

数组实现根据二叉树的先序遍历和中序遍历构造二叉树

根据二叉树的先序遍历和中序遍历构造二叉树是非常经典的一道算法题目,但是在网上找到的资料绝大多数都是使用链接方式构造二叉树,感觉这样比较繁琐,因此自己写了一个数组实现的程序,当然,程序不算很完善,还望朋...

平衡二叉树

由于平衡二叉树的前提是二叉搜索树,故关于二叉搜索树的内容请移步如下网址:http://blog.csdn.net/qq_30091945/article/details/77720865概念平衡因子:...

2014年计算机联考真题——带权路径长度之和

思路如下: 利用层次遍历的思路,记录每层的层数level,对于该层的每个叶节点的带权路径长度 = data*(level-1) 算法如下: //求叶子节点带权路径长度之和 ...

根据二叉树的前序遍历和中序遍历,重构出二叉树

题目:这道题目是一道面试题,先序遍历和中序遍历以数组的形式给出,要求我们根据这两个条件重构出二叉树。 下图是一棵二叉树 // 6 // / \...

并查集

并查集并查集是一种树形结构,又叫“不相交集合”,保持了一组不相交的动态集合,每个集合通过一个代表来识别,代表即集合中的某个成员,通常选择根做这个代表。初始化用数组来建立一个并查集,数组下标代表元素,下...

二叉树的构建及其遍历算法

概要二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有先、中、后,层次四种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容...

二叉搜索树

关于二叉树的基本操作请转到我的另一片博客: http://blog.csdn.net/qq_30091945/article/details/77531651概念Binary Search Tree...

根据先序序列与中序序列构建二叉树

算法如下: 1)先在先序序列中找到根结点, 2)在中序序列中找到根结点位置,(可以将二叉树分为左子树和右子树) 3)用同样的办法构造左子树 4)用同样的办法构造右子树。//根据先序序列与中序序...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)