關於資料結構二叉樹的概念及操作可參看部落格:
二叉搜尋樹又稱為二叉排序樹,它或者是一顆空樹,或者時具有以下性質的二叉樹
最難的部分還是要數二叉搜尋樹的刪除操作
binarysearchtree.h
// binarysearchtree.h
#pragma once
#include #include #include #include typedef int datatype;
typedef struct bstreenode
bstnode, *pbstn;
// 初始化二叉搜尋樹
void initbstree(pbstn* proot);
// 插入值為data的元素
void insertbstree(pbstn* proot, datatype data);
// 刪除值為data的結點
void deletebstree(pbstn* proot, datatype data);
// 在二叉搜尋樹中查詢值為data的結點
pbstn findbstree(pbstn proot, datatype data);
// 中序遍歷二叉搜尋樹
void inorder(pbstn proot);
// 銷毀二叉搜尋樹
void destroybstree(pbstn* proot);
binarysearchtree.c
// binarysearchtree.c
#include "binarysearchtree.h"
// 初始化二叉搜尋樹
void initbstree(bstnode** proot)
pbstn buynewnode(datatype data)
else
return _new;
}// 插入值為data的元素
// 在二叉樹中插入新元素時,必須先檢測該元素是否在樹中已經存在
// 如果已經存在,則不進行插入
// 否則將新元素加入到搜尋停止的地方
// 具體插入過程:
// 1.如果樹為空樹,則直接插入
// 2.樹不空,按二叉搜尋樹性質查詢插入位置,插入新節點
void insertbstree(pbstn* proot, datatype data)
else
else if (data < pcur->_data)
else
}// 插入新節點
if (data < pparent->_data)
else
}}// 在二叉搜尋樹中查詢值為data的結點
pbstn findbstree(pbstn proot, datatype data)
else
else if (data < pcur->_data)
else
}}// 刪除值為data的結點
// 要刪除的節點有四種情況
// 1.要刪除的節點沒有孩子節點
// 直接刪除
// 2.要刪除的節點只有左孩子節點
// 先鏈結,再刪除
// 3.要刪除的節點只有右孩子節點
// 先鏈結,再刪除
// 4.既有左孩子,又有右孩子
// (1)尋找乙個替代節點:下面兩種方法隨便一種都行
// 在當前節點左子樹中找替代節點:左子樹中最右下端的節點
// 在當前節點右子樹中找替代節點:右子樹中最左下端的節點
// (2)交換當前節點和替代節點的值
// (3)修改要刪除的標記----用替代節點覆蓋
// 刪除值為data的結點
void deletebstree(pbstn* proot, datatype data)
else
}else
else
pcur->_data = _preplace->_data;
if (pcur == pparent)
else
pcur = _preplace; // 將待刪除節點更改為替代節點}}
else
else
}else if (pcur->_pright == null)
else
}else
pcur->_data = _preplace->_data;
pparent->_pleft = _preplace->_pright;
pcur = _preplace; // 將待刪除節點更改為替代節點}}
break;
} if (data < pcur->_data)
else
}// 2.刪除節點
if (pcur)
else
}else }
// 中序遍歷二叉搜尋樹
void inorder(pbstn proot)
inorder(proot->_pleft);
printf("%d ", proot->_data);
inorder(proot->_pright);
}// 銷毀二叉搜尋樹
void destroybstree(pbstn* proot)
destroybstree(&(*proot)->_pleft);
destroybstree(&(*proot)->_pright);
free(*proot);
(*proot) = null;
}
test.c
#include "binarysearchtree.h"
void testbinarysearchtree()
; int i = 0;
int size = sizeof(arr) / sizeof(arr[0]);
pbstn ret_find = null;
initbstree(&root);
for (i = 0; i < size; i++)
printf("inorder:");
inorder(root);
printf("\n");
insertbstree(&root, 10);
printf("inorder:");
inorder(root);
printf("\n");
ret_find = findbstree(root, 10);
if (ret_find == null)
else
deletebstree(&root, 2);
printf("inorder:");
inorder(root);
printf("\n");
deletebstree(&root, 1);
printf("inorder:");
inorder(root);
printf("\n");
deletebstree(&root, 5);
printf("inorder:");
inorder(root);
printf("\n");
deletebstree(&root, 3);
printf("inorder:");
inorder(root);
printf("\n");
destroybstree(&root);
}int main()
測試結果:
如有不正,還請指出,有勞!!!
二叉搜尋樹c 資料結構二叉搜尋樹
在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...
資料結構 二叉搜尋樹 遞迴(C語言)
上篇文章 二叉搜尋樹 刪除操作的 過於冗長,我們考慮遞迴版本 1.binarysearchtreerecursion.h pragma once include include include include typedef int datatype typedef struct bstreenod...
資料結構(二叉搜尋樹)
二叉搜尋樹是一種可以高效完成以下操作的樹型的資料結構 插入乙個值 查詢是否含有某個值 刪除某個值 它儲存節點的資料資訊時,遵循以下規則,左子樹的值 根節點值 右子樹的值 下面是基本的二叉搜尋樹的實現 include include include includeusing namespace std...