二叉樹增刪改查 程式實現

2022-06-26 17:09:14 字數 4082 閱讀 1624

二叉排序樹定義

一棵空樹,或者是具有下列性質的二叉樹:

(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為根的平衡...