二叉排序 查詢 樹

2022-02-13 16:24:14 字數 1967 閱讀 7116

二叉排序樹

1.定義

二叉排序樹(binary search tree)又稱二叉搜尋(查詢)樹,其定義如下:

(1)若它的左子樹非空,則左子樹上所有結點的權值都比根結點的權值小;

(2)若它的右子數非空,則右子樹上所有結點的權值都比根結點的權值大;

(3)左、右子樹本身又是一棵二叉排序樹。

以上既是二叉排序樹的定義,同時也是它的性質。從定義可以看出,二叉排序樹的定義是乙個遞迴的定義。對於一棵二叉排序樹的中序遍歷則是乙個遞增有序序列。

2.二叉排序樹的插入insert

根據二叉排序樹的遞迴定義,進行插入操作的時候可以用遞迴實現,其插入過程如下:

(1)如果二叉排序樹為空,則建立乙個關鍵字為key的結點,並將其作為根結點;

(2)否則將key和根結點的key值比較,若相等則返回;

1)若key值小於根結點的key值,判斷根結點的左孩子是否為空,如果為空,則建立乙個關鍵字為key的結點,並將該結點作為根結點的

左孩子;如果不為空,則遞迴插入到該根結點的左子樹當中。

2)若key值大於根結點的key值,判斷根結點的右孩子是否為空,如果為空,則建立乙個關鍵字為key的結點,並將該結點作為根結點的

右孩子;如果不為空,則遞迴插入到該根結點的右子樹當中。

遞迴實現:

void

insert(bstnode *&root,elemtype key) //

注意這裡為什麼用指標的引用

else

else

insert(root->left,key); //

遞迴插入到左子樹中

}

else

//key大於根結點的權值

else

insert(root->right,key); //

遞迴插入到右子樹中

} }

}非遞迴實現:

void insert(bstnode *&root,elemtype key)   //

非遞迴實現

bstnode *p1,*p2;

intflag;

p1=root;

while(p1!=null)

else

}bstnode *p=(bstnode *)malloc(sizeof

(bstnode));

p->key=key;

p->left=null;

p->right=null;

if(flag==0

) p2->left=p;

else

p2->right=p;

}

3.二叉排序樹的查詢

最壞情況的查詢是二叉排序樹行成的是乙個高度為n的線性樹,其平均查詢長度跟順序查詢的相同,為n+1/2;

最好情況是與二分判定樹形態相同,其平均查詢長度和二分查詢相同為logn;

bstnode* search(bstnode *root,elemtype key)

bstnode* search(bstnode *root,elemtype key)

return

p;}

關於二叉排序樹的運用可以看一下poj2418

這道題目有2種解法,一種是採用二叉排序樹去實現,一種是直接採用stl模板實現,下面只給出stl的實現。

#include#include

#include

#include

using

namespace

std;

int main(void

) tree[name]++; //

map若沒有賦初值,則value值預設為0

n++;

}for(it=tree.begin();it!=tree.end();it++)

return0;

}

二叉排序 查詢 樹

二叉排序樹 1.定義 二叉排序樹 binary search tree 又稱二叉搜尋 查詢 樹,其定義如下 1 若它的左子樹非空,則左子樹上所有結點的權值都比根結點的權值小 2 若它的右子數非空,則右子樹上所有結點的權值都比根結點的權值大 3 左 右子樹本身又是一棵二叉排序樹。以上既是二叉排序樹的定...

二叉排序樹 二叉搜尋樹 二叉查詢樹

特點 結構體定義struct node 建樹 建二叉排序樹 void create node root,int t else if t root data create root lc,t else create root rc,t 前序遍歷 層序 字典序 int flag int pre 1001...

二叉排序樹(二叉查詢樹 二叉搜尋樹)

include include typedef struct node node node createnode int value void addnode node root,int value else else void middleorder node node middleoder no...