二叉搜尋樹 《演算法導論》學習筆記十一

2021-07-30 06:56:21 字數 3051 閱讀 4620

二叉搜尋樹是以一顆二叉樹來組織的,每個節點除資料外,還包括三個分別指向父結點、左孩子、右孩子的指標,二叉搜尋樹有個特性:某個結點root的左子樹的某個節點x的關鍵值小於等於root結點右子樹某個結點y的關鍵值。

二叉搜尋樹有幾個操作:

1、查詢

查詢與給定關鍵值相等的結點

2、遍歷

前序、中序、後序遍歷輸出

3、從某結點出發,尋找子樹中最小關鍵值的結點

4、從某結點出發,尋找子樹中最大關鍵值的結點

5、以某種遍歷方式的次數,尋找某結點的前驅結點和後繼結點

例如中序遍歷的順序為123456,則4結點的前驅為3,後繼為5

6、插入結點

7、刪除結點

刪除某個結點後,要把它的後繼結點補在刪除的位置上,要注意:

**:

#include #include #include #include #include typedef struct bisearchtreenode bisearchtreenode;

typedef struct bisearchtree bisearchtree;

int random_num()

void postorder_tree_free(

bisearchtreenode *root )

}void inorder_tree_walk(

bisearchtreenode *root )

}void preorder_tree_walk(

bisearchtreenode *root )

}void postorder_tree_walk(

bisearchtreenode *root )

}void print_tree(

bisearchtree *tree )

bisearchtreenode *tree_search_recursion(

bisearchtreenode *root,

int key )

if ( key < root->key )

return tree_search_recursion( root->left, key );

else

return tree_search_recursion( root->right, key );

}bisearchtreenode *tree_search(

bisearchtreenode *root,

int key )

return root;

}bisearchtreenode *tree_minimum(

bisearchtreenode *root )

return root;

}bisearchtreenode *tree_maximum(

bisearchtreenode *root )

return root;

}// 找前驅 即中序遍歷的前乙個位置值

bisearchtreenode *tree_predecessor(

bisearchtreenode *node )

return p;

}// 找後繼 即中序遍歷的後乙個位置值

bisearchtreenode *tree_successor(

bisearchtreenode *node )

return p;

}void tree_insert(

bisearchtree *tree,

bisearchtreenode *node )

node->parent = p;

if ( p == null )

else if ( node->key < p->key )

p->left = node;

else

p->right = node;

}void transplant(

bisearchtree *tree,

bisearchtreenode *node_a,

bisearchtreenode *node_b )

void tree_delete(

bisearchtree *tree,

bisearchtreenode *node )

transplant( tree, node, p );

p->left = node->left;

p->left->parent = p;

}free( node );

}void free_tree(

bisearchtree *tree )

int main(

int argc,

char **argv )

; bisearchtree *tree = ( bisearchtree * )malloc( sizeof(bisearchtree) );

tree->node_num = 0;

tree->height = 0;

for ( i = 0; i < len; i++ )

print_tree( tree );

for ( i = 0; i < len; i++ )

bisearchtreenode *delete_node = tree_search( tree->root, 4 );

if ( delete_node != null )

printf("\n刪除%d的節點後中序遍歷順序為:", 4);

inorder_tree_walk( tree->root );

printf("\n");

delete_node = tree_search( tree->root, 15 );

if ( delete_node != null )

printf("\n刪除%d的節點後中序遍歷順序為:", 15);

inorder_tree_walk( tree->root );

printf("\n");

free_tree( tree );

return 0;

}

《演算法導論》筆記 二叉搜尋樹

演算法 資料結構 二叉搜尋樹 binary search tree 是經過一定地組織形成的有特定結構特徵的二叉樹,支援各種動態集合 dynamic set 操作 如insert delete maximum minimum等等 這些操作的時間複雜度與樹的高度成正比。一棵有n個節點的完全二叉樹 com...

《演算法導論》學習筆記(3) 二叉搜尋樹

二叉搜尋樹是以一棵二叉樹來組織的。在二叉樹的基礎上,增加了一些限制 對於任何結點x,其左子樹的任何結點都不大於x.key,右子樹的任何結點都不小於x.key。二者都是基於二叉樹來構建的資料結構,但是二者的區別在於 二叉堆 最大堆 的每個結點的值都大於等於其兩個兒子的值,二叉查詢樹的父親是小於等於其右...

演算法導論 二叉搜尋樹

搜尋樹資料結構支援許多動態集合操作,包括search minimum maximum predecessor successor insert和delete等。因此,我們使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。對於乙個有n個結點...