概要
这是王道数据结构复习资料上的一道题。该书给出了递归算法,但是解析中对于非递归算法说使用非递归中序遍历的思路进行解答,然而这种思路需要将结点全部压入堆栈之后,依次出栈,这样会带来多余的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