二叉搜尋樹(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 採用先序遍歷...