bst.h
#pragma once
#includetypedef char btreetype;
/*建立乙個二叉搜尋樹的結構*/
typedef struct btreenodebtreenode;
/*初始化乙個二叉搜尋樹*/
void btreeinit(btreenode** btree);
/*在二叉搜尋樹中插入乙個元素*/
void btreeinsert1(btreenode** btree, btreetype value);
/*使用迭代的方法插入*/
void btreeinsert2(btreenode** btree, btreetype value);
/*在二叉搜尋樹中刪除乙個元素*/
void removebst(btreenode** btree, btreetype del_value);
void deletenode(btreenode** pnode);
/*在二叉搜尋樹中查詢乙個元素*/
btreenode* btreefind1(btreenode* btree, btreetype sel_value);
btreenode* btreefind2(btreenode* btree, btreetype sel_value);
bst.c
#define _crt_secure_no_warnings 1
#include"binarytree.h"
/*初始化乙個二叉搜尋樹*/
void btreeinit(btreenode** btree)
/*初始化,把根結點初始化為空*/
(*btree) = null;
}/*建立乙個二叉樹結點*/
btreenode* createnode(btreetype value)
return ptr;
}/*在二叉搜尋樹中插入乙個元素*/
void btreeinsert1(btreenode** btree, btreetype value)
/* **若樹為空,則把插入節點作為根結點插入空樹
**若樹不為空
**1.若插入結點的資料小於根節點的資料,則將其插入左子樹
**2.若插入結點的資料大於根節點的資料,則將其插入右子樹
*/ if (*btree == null)
else
else
btreeinsert1(&((*btree)->right), value);
} }}/*使用迭代的方法插入*/
void btreeinsert2(btreenode** btree, btreetype value)
/* **建立兩個指標,curr用於檢查樹中的結點,link用於插入結點
**因為不能改變樹根,所以用了兩個指標
**cur是查詢當前結點的插入位置,*link是指向cur指標的指標
*/ btreenode* cur;
btreenode** link = btree;
while ((cur = *link))
else
link = &cur->right;
} }/*如果正常迴圈,到了這裡,*cur已經是葉結點的某個子樹了*/
btreenode* insert = createnode(value);
*link = insert;
}/*在二叉搜尋樹中查詢乙個元素*/
btreenode* btreefind1(btreenode* btree, btreetype sel_value)
btreenode* cur = btree;
while (cur != null && sel_value != cur->data)
else
} if (cur != null)
else
}btreenode* btreefind2(btreenode* btree, btreetype sel_value)
else if (sel_value == btree->data)
else if (sel_value < btree->data)
else if (sel_value > btree->data)
}/*在二叉搜尋樹中刪除乙個元素*/
/***三種情況
**1.刪除的元素結點為葉節點,直接刪除
**2.刪除的元素結點只有乙個左子樹結點或者右子樹結點,直接刪除然後鏈結刪除元素結點的雙親結點
**3.刪除的元素結點有兩個子結點
** 方法1:找出需要刪除的元素結點的左子樹中最大的元素結點,並用這個值代替被刪除的結點
** 方法2:暫時還不會
*/void removebst(btreenode** btree, btreetype value)
if (*btree == null)
else
else if (value < (*btree)->data)
else if (value >(*btree)->data) }}
/*銷毀某個結點*/
void destorynode(btreenode* del_node)
free(del_node);
}/*刪除某個結點*/
void deletenode(btreenode** pnode)
if (*pnode == null)
btreenode* qnode, *snode;
if (!(*pnode)->left && !(*pnode)->right)
else if (!(*pnode)->left)
else if (!(*pnode)->right)
else
(*pnode)->data = snode->data;
/***如果執行迴圈,表示需要刪除的結點的左子樹沒有右孩子,此時需要接左子樹
**如果未執行迴圈,此時需要接右子樹
*/if (qnode == (*pnode))
else
}}
test.c
#define _crt_secure_no_warnings 1
#include"binarytree.h"
#include#define testhead printf("------------------%s------------------\n\n",__function__)
void testinsert()
void testfind()
void testdelete()
int main()
資料結構 二叉搜尋樹 查詢 插入 刪除
2017 12 12 2 00 武漢工程大學郵電與資訊工程學院郵科院校區 軟體工程1604穀子毅 二叉搜尋樹 也叫二叉排序樹或二叉查詢樹 一顆二叉樹,可以為空 如果不空,滿足以下性質 1.非空左子樹的所有鍵值小於根節點 2.非空左子樹的所有鍵值小於根節點 3.左右子樹都是二叉搜尋數 部分函式 1.查...
資料結構 搜尋二叉樹的插入 刪除 查詢
搜尋二叉樹 非遞迴 搜尋二叉樹的插入 int bstreeinsert bstreenode pptree,datatype x parent null cur pptree while cur else if cur dataelse 找到要插入的位置 if parent dataelse ret...
資料結構 二叉排序樹 查入 搜尋 刪除
動態查詢 動態查詢不僅要查詢結點,而且還要不斷地插入和刪除結點,當表採用順序結構時,這需要花費大量的時間用於結點的移動,效率很低。這裡採用樹表的形式,樹表本身可以動態建立,樹表主要有二叉排序樹,平衡二叉樹,b 樹和 b 樹等。二叉排序樹的特點是 lchild root rchild 對此樹中序遍歷就...