二叉樹學習筆記2

2021-09-22 16:38:10 字數 3099 閱讀 9243

二叉搜尋樹(bst):binary search tree的首字母大寫構成。

【特點】:它是乙個特殊的二叉樹,樹中的結點必須滿足:根節點的值大於左子樹的值且小於右子樹的值。即:根》左,根《右。

下面,我們來看二叉樹的建立:

我們知道,二叉樹的結點不僅包括資料,還包含指向子節點的指標。所以,每個結點就應該用結構體實現。

typedef struct node

node

typedef struct

tree;

可以將這一步分為以下幾個小步來實現:

3.1 將乙個資料打包成乙個結點

樹是又結點組成的。所以,我們需要將乙個資料打包成乙個結點,以便於下面的操作。

使用malloc函式開闢乙個node型別的新結點,將它的左右子樹都置空;注:malloc函式在標頭檔案#include

node* node = (node*)malloc(sizeof(node));		//建立乙個新的結點;

node->data = value;

node->left = null;

node->right = null;

3.2 建立第乙個根節點

將第乙個資料作為乙個根節點;

if (tree->root == null)			//如果此時這個樹的根節點為空的話,就讓它做根節點;

3.3 建立後續結點

與根節點比較,如果比它小,就放進左邊,如果左邊還有資料,就把左邊的資料當做根節點繼續比較。如果比它大,就放進右邊,如果右邊還有資料,就把右邊的資料當做根節點繼續比較。

可以看到,這是乙個while的過程。為了不使他的根節點發生變化,我們可以定義乙個臨時的node型別的變數代替執行操作;

else

else

}else

else

}} }

3.4 二叉搜尋樹的高度
樹的高度=max(左子樹高度,右子樹高度)+1;

可以通過遞迴求其高度。

int get_hight(node* node)//求樹的高度;

else

return max + 1;//樹的高度=max(左子樹高度,右子樹高度)+1;

}}

3.5 二叉搜尋樹中的最大值
在二叉搜尋樹中求最大值,可以直接找葉子結點的最右邊的值,它就是最大的數。

一般的樹中,求最大值。可以求左子樹的最大值,右子樹的最大值,和根節點值比較,三者最大者即為樹的最大值,這種方法也適應於二叉搜尋樹。

用遞迴實現;

int max(node* node)	//普通樹求最大值,也適應與二叉搜尋樹,二叉搜尋樹也可以直接找最右邊的值,它就是最大值;

else

if (max1到此,乙個樹形結構就建立完成了;

可以用前序遍歷,中序遍歷,後序遍歷進行輸出。

注意::二叉搜尋樹的中序遍歷是從小大乙個有序的資料列;

完整**實現如下:

#include

#include

using namespace std;

typedef

struct node

node;

typedef

struct

tree;

void

insert

(tree* tree,

int value)

else

else

}else

else}}

}}void

preorder

(node* p1)

//前序遍歷;

}void

inorder

(node* p2)

//中序遍歷,從小到大排序

}void

postorder

(node* p3)

//後序遍歷;

}int

get_hight

(node* node)

//求樹的高度;

else

return max +1;

//樹的高度=max(左子樹高度,右子樹高度)+1;}}

intmax

(node* node)

//普通樹求最大值,也適應與二叉搜尋樹,二叉搜尋樹也可以直接找最右邊的值,它就是最大值;

else

if(max1

return max1;}}

intmain()

; tree tree;

//定義乙個樹形變數;

tree.root =

null

;//開始時,它的根節點初始為空;

for(

int i =

0; i<

7; i++

) cout <<

"先序遍歷:"

<< endl;

preorder

(tree.root)

; cout <<

"中序遍歷:"

<< endl;

inorder

(tree.root)

; cout <<

"樹的高度:"

; cout <<

get_hight

(tree.root)

<< endl;

cout <<

"樹的最大值:"

二叉樹的操作還有:

【插入】

【刪除】

【查詢】

這一篇中樹中的資料都假設沒有重複的且沒有負值。

待更。。。。。。。。

二叉樹學習筆記

二叉樹是樹的一種特殊結構,也是一種極為重要的樹,二叉樹最重要的操作是遍歷,即按照一定的順序訪問樹中的所有節點,常見的遍歷方式有 對遍歷來說,最容易想到的方式就是遞迴,遞迴 簡單,但是效率不高,需要的棧空間比較大,非遞迴的方法 較為複雜,不過效率較高。遞迴實現 void preordervisit b...

二叉樹學習筆記

1.訪問根節點 2.在訪問第 l 層時,將 l 1 層的節點按順序儲存到佇列中 3.進入下一層並訪問該層的所有節點 4.重複上述操作直到所有層都訪問完 時間複雜度 o n 空間複雜度o n 最壞的情況下,最後一層的所有節點可能在佇列中 void levelorder node root q.dele...

二叉樹學習筆記

二.遞迴解法 三.非遞迴解法 include using namespace std char ch typedef char elemtype typedef struct bitnodebitnode,bitree 先序序列存入 void createbitree bitree t 採用先序遍歷...