常用資料結構 二叉查詢樹 C實現

2021-09-11 21:55:28 字數 2515 閱讀 2218

二叉查詢樹 其 基本的執行操作的時間與樹的高度成正比。對於n個節點的 完全二叉查詢樹 操作的最壞情況為 lgn但對n個節點的線性鏈來說,操作的最壞情況為n。總之,乙個隨機構造的二叉查詢樹的期望高度為 lgn, 基本動態集合操作的平均時間為lgn

某節點的左子樹節點值均小於該節點值,右子樹節點值均大於該節點值。

二叉搜尋樹  按  樹的中序遍歷 可以得到  從小到大排序的佇列

插入節點時,新寫了一種使用遞迴的方法來進行插入,這種方法比較容易理解,不用分多種情況討論

typedef struct treenode  treenode;

treenode* search_recursion(treenode *t, int k)

if (k < t->data)

else

return search_recursion(t->right, k);

}treenode* search_nonrecursion(treenode *t, int k)

return t;

}treenode* minimum(treenode *t)

return t;}​

treenode* maximum(treenode *t)

return t;}/*

15/ \

6 18

/ \17 20

/16    

找16的直接前驅

1、找到17,判斷16是17的左孩子

2、找到18,判斷17是18的左孩子

3、找到15,判斷18是15的右孩子, return 15

# 完*/treenode* presuccessor(treenode *t)

treenode *y = t->parent;

while (y != null && t == y->left)// 當左節點為空時,一直向上找,直到找到某個節點是其父節點的左兒子時終止

t = y;

y = y->parent;

}return y;}/*

15/ \

6 18

/ \3   7\13

找13的直接後繼

1、找到7,判斷13是7的右孩子

2、找到6,判斷7是6的右孩子

3、找到15,判斷6是15的左孩子

# 完*/treenode* successor(treenode *t)

return y;}​

// 這是非遞迴的插入

// 二叉查詢樹插入的位置一定是在葉子節點上,而不會插入到樹中間

// 所以只需要改變其指向就好

void insert(treenode *t, int x)

else

}node->parent = y;

if (y == null)

else if (x < y->data)

else

y->right = node;}​

// 此外,還可以利用遞迴的方法來進行插入。這種方法容易理解,但是在我的**中,二叉查詢樹節點包括父

// 親節點,此時需要給插入節點的父親節點賦值,這點比較麻煩,因此建立了乙個新的函式用來插入

treenode* insert_recursion(treenode *t, treenode *node, treenode *p)

if (t->data >= node->data)

else t->right = insert_recursion(t->right, node, t);

return t;

}treenode* insert_recursion(treenode *t, int x)

node->parent = t->parent;

return insert_recursion(t, node, t->parent);}/*

分三種情況

1、 該節點沒有雙子女,則直接刪除該節點

2、 只有乙個子女,直接刪除,並將該子女直接用來代替該節點

3、 該節點有雙子女,則需要找到它的直接後繼,先刪除它的直接後繼,然後將直接後繼的內容代替要刪除節點的內容,

*/void delete(treenode *t, int x)

else

if (y->left != null)

z = y->left;

else

z = y->right;

if (z != null)

z->parent = y->parent; // 將要刪除節點y的子女指向y的父親

if (y->parent == null)

else if (y == y->parent->left)

y->parent->left = z;

else

y->parent->right = z;

if (y->data != x)  

}

(資料結構)二叉查詢樹

樹,是一種資料結構。它是由n個有限節點組成乙個具有層次關係的集合。特點 樹的基本術語 節點的度 節點擁有的子樹的數目。葉子 度為零的節點。分支節點 度不為零的節點。樹的度 樹中節點的最大的度。層次 根節點的層次為1,其餘節點的層次等於該節點的雙親的層次加1。樹的高度 樹中節點的最大層次。無序樹 如果...

資料結構 二叉查詢樹

使二叉樹成為二叉查詢樹的性質是,對於樹中的每個節點x,它的左子樹中所有關鍵字值小於x的關鍵字值,而它的右子樹中所有關鍵字值大於x的關鍵字值。這意味著,該樹所有的元素以某種統一的方式排序。二叉查詢樹是一棵特殊的二叉樹,二叉查詢樹中節點的結構與二叉樹種節點的結構相同,關鍵在於可以在二叉查詢樹上可以執行的...

資料結構 樹 二叉查詢樹

wiki 首先是名稱 二叉查詢樹英文叫binary search tree,這個在很多演算法題目中很常見所以要記住,特別是英文題目中。也叫做二叉排序樹,二叉搜尋樹等等。具體的定義比較官方,用自己的話說,首先它肯定是二叉樹,其次,當前節點的左子葉元素值比當前節點小,右子葉元素值比當前節點大,所以節點均...