資料結構 二叉搜尋樹的插入刪除查詢

2021-08-15 09:35:14 字數 3402 閱讀 1021

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 對此樹中序遍歷就...