41 二叉樹的基本運算

2021-08-21 06:21:54 字數 1755 閱讀 5870

二叉樹的基本運算是基於鏈式儲存結構的:

1. 建立二叉樹createbtnode(*b,*str):根據二叉樹括號表示法的字串*str生成對應的鏈式儲存結構。

2. 查詢節點findnode(*b,x):在二叉樹b中尋找data域值為x的節點,並返回指向該節點的指標

3. 找孩子節點lchildnode(p)和rchild-node(p):分別求二叉樹中節點*p的左孩子節點和右孩子節點。

4.求高度btnodedepth(*b):求二叉樹b的高度。若二叉樹為空,則其高度為0;否則,其高度等於左子樹與右子樹中的最大高度加l

5. 輸出二叉樹dispbtnode(*b):以括號表示法輸出一棵二叉樹

例:str —— a ( b ( d ( , g ) ) , c ( e , f ) )

掃瞄採用括號表示法表示二叉樹的字串,讀到的符號為ch

使用乙個棧st儲存雙親節點,k指定其後處理的節點是雙親節點(儲存在棧中)的左孩子節點(k=1)還是右孩子節點(k=2)。

分以下幾種情況:

1.若ch=』(『:則將前面剛建立的節點作為雙親節點進棧,並置k=1,表示其後建立的節點將作為這個節點的左孩子節點

2.若ch=『,』:表示其後建立的節點為右孩子節點,置k=2;

3.若ch=』)』:表示棧中節點的左右孩子節點處理完畢,退棧;

4.其他情況:

當k=1時,表示這個節點作為棧中節點的左孩子節點;

當k=2時,表示這個節點作為棧中節點的右孩子節點

如此迴圈直到str處理完畢

建立後的二叉樹效果如下:

查詢節點findnode(*b,x):

用遞迴演算法,採用」根-左子樹-右子樹」的順序,查詢值為x的節點,找到值為x的結點後返回節點指標,否則返回null。

btnode *findnode(btnode *b,elemtype x)

}

以btnode r1=*findnode(b, 『c』);為例,我們來看一下查詢節點演算法的遞迴呼叫過程:

a是根節點,以根—左—右的順序遍歷節點,直到找到c節點為止。

直接返回*p節點的左孩子節點或右孩子節點的指標。

//找左孩子節點

btnode *lchildnode(btnode *p)

//找右孩子節點

btnode *rchildnode(btnode *p)

1. 當樹為null時,說明這是一棵空樹,而空樹的高度為0

2. 當樹不為null時,說明這棵樹有節點,因此可以求出樹的左子樹和右子樹的高度,並返回其中最大的高度 + 1。

int btnodedepth(btnode *b)

}

用括弧表示法輸出二叉樹:

對於非空二叉樹b

先輸出其元素值

當存在左孩子或右孩子節點時

輸出乙個「(」符號

遞迴處理左子樹

如果左子樹不為null,則輸出乙個「,」符號

遞迴處理右子樹

最後輸出乙個「)」符號

void dispbtnode(btnode *b)}}

二叉樹 基本運算

一 括號表示法建二叉樹 核心 void make btree print b view code 二 查詢節點 核心 btnode find node btnode b1,char x 查詢節點數值等於x的節點 view code 三 求樹高 核心 int get high const btnode...

二叉樹的基本運算

今天資料結構實驗課,做實驗,二叉樹的基本運算,題目要求挺長的,上課坐著沒事幹,寫了一點,放這以後還能看看。呵呵 題目要求 問題描述 建立一棵二叉樹,試程式設計實現二叉樹的如下基本操作 1.按先序序列構造一棵二叉鍊錶表示的二叉樹t 2.對這棵二叉樹進行遍歷 先序 中序 後序以及層次遍歷,分別輸出結點的...

二叉樹的基本運算

編寫乙個程式實現二叉樹的基本功能 1 使用者輸入字串建立二叉樹,a b d,e h j,k l,m n c f,g i 2 1 實現二叉樹的各種遍歷。包括先序遍歷 中序遍歷 後序遍歷的歸和非遞迴演算法 以及層次遍歷。2 要求能查詢任一結點在某種遍歷序列中的前驅和後繼。3 查詢輸出從根結點a出發到任意...