二叉排序樹定義
一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
(4)沒有鍵值相等的結點。
二叉樹刪除節點
二叉排序樹刪除節點的時候為其刪除後還是乙個二叉排序樹,要對不同的情況進行分別處理
1、p結點為葉子結點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則可以直接刪除此子結點。
2、p結點只有左子樹pl或右子樹pr,此時只要令pl或pr直接成為其雙親結點*f的左子樹(當*p是左子樹)或右子樹(當*p是右子樹)即可,作此修改也不破壞二叉排序樹的特性。
3、p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:
其一是令*p的左子樹為*f的左/右(依*p是*f的左子樹還是右子樹而定)子樹,*s為*p左子樹的最右下的結點,而*p的右子樹為*s的右子樹;
其二是令*p的直接前驅(或直接後繼)替代*p,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)-即讓*f的左子樹(如果有的話)成為*p左子樹的最左下結點(如果有的話),再讓*f成為*p的左右結點的父結點。
二叉排序樹效能分析
每個結點的c(i)為該結點的層次數。最壞情況下,當先後插入的關鍵字有序時,構成的二叉排序樹蛻變為單支樹,樹的深度為其平均查詢長度(n+1)/2(和順序查詢相同),最好的情況是二叉排序樹的形態和折半查詢的判定樹相同,其平均查詢長度和log 2 (n)成正比。
給定值的比較次數等於給定值節點在二叉排序樹中的層數。如果二叉排序樹是平衡的,則n個節點的二叉排序樹的高度為log2n+1,其查詢效率為o(log2n),近似於折半查詢。如果二叉排序樹完全不平衡,則其深度可達到n,查詢效率為o(n),退化為順序查詢。一般的,二叉排序樹的查詢效能在o(log2n)到o(n)之間。因此,為了獲得較好的查詢效能,就要構造一棵平衡的二叉排序樹。
程式功能要求
//二叉排序樹
2 #include 3 #include 4
#define maxn 20
5 typedef long
long
ll;6 typedef struct
node
7 nodes;
12 typedef struct
treenode
13 treenode;
18//
構造樹節點
19 treenode* createtreenode(nodes val) //
這就是創造乙個樹節點,給他的左右子樹都賦值為null
2028
//根據這個陣列裡面的值建立一顆二叉樹
29 treenode* createtree(nodes *array,int
length)
3045
else
if(temp->val.id//
比這個節點值小的去右子樹
4649
else
//不會重複插入同一樹節點
5053}54
if(parent->val.id>array[i].id)
55 parent->lchild=createtreenode(array[i]);
56else
57 parent->rchild=createtreenode(array[i]);
58 i++;59}
60return root; //
建立樹的根節點61}
62//
刪除節點的核心方法
63void deletenode(treenode *node,treenode *parent)
6470
else
7174
if(node->lchild==null&&node->rchild==null) //
如果被刪節點左右子樹都不存在,那就把這個節點直接刪了就完了(so easy)
7580
else
8184}85
else
if(node->lchild!=null&&node->rchild==null) //
刪除節點有左子樹
8692
else
9396}97
else
if(node->rchild!=null&&node->lchild==null) //
刪除節點有右子樹
98104
else
105108
}109
else
110121
//替補
122 node->val = in->val;
123if(pre==node)//
判斷刪除節點右子樹是否只有乙個節點
124 pre->rchild =null;
125else
//如果不是 則刪除pre的左子樹
126 pre->lchild =null;
127}
128}
129//
遞迴尋找刪除節點的位置
130void del(treenode *node,int key,treenode *parent)
131138
else
if(key>node->val.id)
139142
else
143146
}147
//先序輸出
148void output(treenode *root)
149156
//查詢節點
157 treenode* searchtree(treenode *root,int
key)
158163
if(root->val.id==key)
164167 root->val.id>key?searchtree(root->lchild,key):searchtree(root->rchild,key);//
向左或向右查詢
168}
169//
插入節點
170 treenode* insertnode(nodes value,treenode *root)
171177
if(root->val.id == value.id) //
如果相等 則直接返回
178181
if(root->val.id>value.id)
182186
else
187191
return
root;
192}
193void
display()
194206
void
menu()
207246
else
if(x==1
)247
255else
if(x==2
)256
269else
if(x==3
)270
280 root =createtree(a,y);
281 system("
pause");
282}
283else
if(x==4
)284
291else
if(x==5
)292
298else
299304
}305
return
;306
}307
intmain()
308view code
java二叉樹增刪改查詳解
二叉樹的刪除和修改 建議讀者先看二叉樹的建立,遍歷,插入和查詢 然後找到要插入的結點。找法有三種情況 注意事項 原來刪除結點的左右孩子結點和父結點不用管,只要把該插入結點的值給刪除結點就行了,同時你還要把上去的結點的孩子結點處理一下。以便不影響後續操作。雖然說得有些繞,不過其實也沒什麼東西。就是把插...
二叉搜尋樹的增刪改查
二叉搜尋樹 binary search tree 簡稱 bst,是一種特殊形式的二叉樹。二叉搜尋樹的的結構有兩種可能 對於二叉搜尋樹,需要掌握基本的操作 當要查詢目標值的節點時,我們可以根據二叉樹的結點資料值的有序性 左孩子 根結點 右孩子 根據以下思路進行查詢 簡單實現 返回以目標值結點為根結點的...
二叉樹的基本操作(增 刪 改 查) C C
include include include define maxsize 1024 typedef int telemtype typedef struct bstnode bstnode 建立節點 bstnode creatbstnode telemtype data 在以為root為根的平衡...