二叉搜尋樹是以一顆二叉樹來組織的,每個節點除資料外,還包括三個分別指向父結點、左孩子、右孩子的指標,二叉搜尋樹有個特性:某個結點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個結點...