首先約定結點和元素型別的的定義:
typedef
int elementtype;
typedef
struct tnode *position;
typedef position bintree;
struct tnode;
對於二叉樹的插入演算法,從原理上理解是很簡單自然的:我們首先需要考慮的是樹是空樹該怎麼辦,這是問題的起點。因此,當樹是空的,那麼當前插入的值就是根結點的元素值。肯定不能直接把元素直接丟在那裡,需要用結點的標準形式封裝起來。即:
if(bst ==
null) // 是一棵空樹的時候,插入的結點就是根結點
如果一般情況下,樹中已經有部分結點了,我們知道,二叉樹的左結點小於根,根結點小於右邊的結點,這是乙個遞迴的性質。因此,想插入乙個新的結點,即需要不斷和其他結點比較。這個其他結點具體指代什麼呢?首先,進來是和根結點比,如果比根結點小,那麼就往左走,再和根節點的左子樹的根節點比較,假如此時比左子樹的根結點值小,不是說就直接插到它的左邊結點,為什麼呢?因為左子樹的左結點可能不是空的啊!因為比左子樹的根結點小,所以還是得往左邊走。如果恰好左子樹的左邊沒有結點,那就ok,加入到這個位置。
往右邊走也是相似的道理。
下面是完整**:
// 函式insert將x插入二叉搜尋樹bst並返回結果樹的根結點指標;
bintree insert( bintree bst, elementtype x ) //迴圈版本的插入演算法
else
if(x < node->
data)
else
}else
else}}
}}
但是這種插入操作,問題本身是遞迴的,最簡潔的是用遞迴演算法,但是遞迴演算法雖然簡單,但是需要更多的理解才能大膽的用起來。
這次只討論非遞迴的演算法實現。
以上。
二叉樹非遞迴演算法
程式小白,希望和大家多交流,共同學習 非遞迴二叉樹借用棧 使用鏈棧,使用它的原因 1.需要使用先進後出的儲存結構 2.需要儲存資料個數不定 三種遍歷儲存的雖然都是相同的資料型別,但是使用的目的不一樣,所以使用的位置不一樣 先序遍歷 根據給定的根節點,直接訪問根節點 左結點,有左孩子的結點有兩重身份 ...
二叉樹 遞迴 非遞迴
include include include include using namespace std typedef struct node bintree typedef struct node1 btnode void creatbintree char s,bintree root 建立二叉...
非遞迴二叉樹
由於棧和遞迴原理相同,且遞迴建立二叉樹的效率較低,所以我們可以借助棧來實現二叉樹的非遞迴建立以及遍歷。include include using namespace std template struct binarytreenode template class binarytree binary...