二叉樹(二)之二叉查詢樹

2021-08-26 05:10:58 字數 3501 閱讀 7343

目錄

一、二叉查詢樹的概念

二、二叉查詢樹的實現

三、**

**:二叉查詢樹(binary search tree),又被稱為二叉搜尋樹。

它是特殊的二叉樹:對於二叉樹,假設x為二叉樹中的任意乙個結點,x節點包含關鍵字key,節點x的key值記為key[x]。如果y是x的左子樹中的乙個結點,則key[y] <= key[x];如果y是x的右子樹的乙個結點,則key[y] >= key[x]。那麼,這棵樹就是二叉查詢樹。如下圖所示:

在二叉查詢樹中:

(1) 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

(2) 任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

(3) 任意節點的左、右子樹也分別為二叉查詢樹。

(4) 沒有鍵值相等的節點(no duplicate nodes)。

1、節點定義

typedef int elemtype;

typedef struct bstnode

bstnode,*pnode;

2、建樹(即插入節點)

//向樹中插入節點,若此節點在不在樹中則插入,已在樹中則不插入

pnode insertbst(elemtype data,pnode root)

if(datadata)

root->lchild=insertbst(data,root->lchild);

else if(data>root->data)

root->rchild=insertbst(data,root->rchild);

return root;

}

3、在樹中查詢某個節點根據二叉查詢樹的性質,只需判斷查詢值與節點的大小關係,若比節點小則遞迴左子樹,反之遞迴右子樹。

//查詢結點,樹中存在結點值為data的結點返回true,否則返回false

bool searchbst(pnode t,elemtype data)

4、查詢該樹的最大值、最小值最小值採用遞迴實現,最大值採用非遞迴實現,根據二叉查詢樹的性質,最小值為左子樹的最左節點,最大值為右子樹的最右節點。

//查詢二叉查詢樹中最大、最小節點值;從根節點開始查詢左兒子,

//只要存在左兒子就一直查詢,終點就是最小的元素,最大的為右兒子查詢終點

pnode findmin(pnode root)

pnode findmax(pnode root)

5、刪除節點稍微有些複雜,需要分3種情況分別討論。

(1)需要刪除的是葉節點(沒有子節點的節點),直接把節點刪除即可。

(2)需要刪除的是鏈節點(只有乙個子節點的節點),為了刪除這個節點而不影響它的子樹,需要用它的子節點代替它的位置,然後把它刪除。

(3)需要刪除的節點由兩個非空子節點。由於情況比較複雜,一般用它右子樹的最小值來代替它,然後把它刪除。

//刪除乙個結點:如果是葉結點則直接刪除;

//如果結點有乙個孩子,則直接用該結點父節點連線此結點孩子結點,刪除此節點;

//如果結點有兩個孩子結點,則用其右子樹的最小資料代替該結點的資料並遞迴的刪除那個最小結點,因為右子樹的

//最小結點不可能有左兒子因此第二次刪除比較容易

pnode deletebst(pnode root,elemtype data)

else

root=(root->lchild!=null)?root->lchild:root->rchild;

return root;

}

#includeconst int n=7;  //插入查詢樹陣列長度

using namespace std;

/* 二叉查詢樹 操作*/

typedef int elemtype;

typedef struct bstnode

bstnode,*pnode;

//查詢結點,樹中存在結點值為data的結點返回true,否則返回false

bool searchbst(pnode t,elemtype data)

//向樹中插入節點,若此節點在不在樹中則插入,已在樹中則不插入

pnode insertbst(elemtype data,pnode root)

if(data < root->data)

root->lchild=insertbst(data,root->lchild);

else if(data > root->data)

root->rchild=insertbst(data,root->rchild);

return root;

}//查詢二叉查詢樹中最大、最小節點值;從根節點開始查詢左兒子,

//只要存在左兒子就一直查詢,終點就是最小的元素,最大的為右兒子查詢終點

pnode findmin(pnode root)

pnode findmax(pnode root)

//刪除乙個結點:如果是葉結點則直接刪除;

//如果結點有乙個孩子,則直接用該結點父節點連線此結點孩子結點,刪除此節點;

//如果結點有兩個孩子結點,則用其右子樹的最小資料代替該結點的資料並遞迴的刪除那個最小結點,因為右子樹的

//最小結點不可能有左兒子因此第二次刪除比較容易

pnode deletebst(pnode root,elemtype data)

else

root=(root->lchild!=null)?root->lchild:root->rchild;

return root;

}//中序輸出:中序遍歷二叉查詢樹可以得到原關鍵字有序序列

void print(pnode root)

}int main(int argc, char *argv) ;

int i;

pnode root = null; //二叉查詢樹根節點

for(i=0;idata);

//查詢最大值

pnode max=findmax(root);

printf("最大值為:%d\n",max->data);

//插入節點

root = insertbst(55,root);

print(root);

printf("\n");

//刪除節點24

root = deletebst(root,24);

print(root);

printf("\n");

return 0;

}

二叉樹之 二叉樹深度

二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...

二叉樹 二叉查詢樹

二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...