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

概要

这是王道数据结构复习资料上的一道题。该书给出了递归算法,但是解析中对于非递归算法说使用非递归中序遍历的思路进行解答,然而这种思路需要将结点全部压入堆栈之后,依次出栈,这样会带来多余的O(n)的时间。根据 二叉搜索树的性质可知,二叉搜索树的中序遍历是从小到大的序列,但是题意却是要从大到小输出,故需要采用右根左的遍历方式就能直接得到题意所要求的序列,而不需经过中序遍历入栈与出栈操作。


算法如下:

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daipuweiai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值