1. 程式人生 > >從大到小輸出二叉搜尋樹中鍵值不小於K的關鍵字

從大到小輸出二叉搜尋樹中鍵值不小於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; } } } }