資料結構之二叉搜尋樹的簡單實現 C 實現)

2021-09-03 09:47:03 字數 4364 閱讀 7472

插入:insert()

查詢:search()

刪除:remove()

清除整個樹:clear()

最大值:max()

最小值:min()

前序遍歷:preorder()

中序遍歷:inorder()

後序遍歷:postorder()

注:此二叉樹允許插入相同的值,且預設將其放在右子樹,因此以後會考慮寫unique()函式

templatestruct bsnode      //二叉樹的結點

};templateclass bstree

bstree(int rootvalue)

//bstree(const bstree& that);

~bstree();

/*其他操作*/

void insert(const t& data); //插入乙個資料

bsnode* search(const t& data) const; //查詢第乙個相等的值的位址

void remove(const t& data); //根據值刪除結點

void clear(); //清除整個樹

bsnode* max(); //找到最大值

bsnode* min(); //找到最小值

/*遍歷*/

void preorder() const;

void inorder() const;

void postorder() const;

private:

void insert(bsnode* pfindnode, bsnode* pinsertnode);

bsnode* search(bsnode* proot, const t& data) const; //搜尋

void remove(bsnode* pfind, bsnode* pparent); //pfind為待刪除的結點,pparent其雙親結點

void clear(bsnode*& proot); //注意,這裡的引數一定要傳引用或者二級指標。

bsnode* max(bsnode* proot); //設定從proot開始找

bsnode* min(bsnode* proot); //設定從proot開始找

void preorder(bsnode*proot) const;

void inorder(bsnode*proot) const;

void postorder(bsnode*proot) const;

};

templateinline bstree::~bstree()

templateinline void bstree::insert(const t & data)

}templateinline bsnode* bstree::search(const t & data) const

templateinline void bstree::remove(const t & data) }}

templateinline void bstree::preorder() const

templateinline void bstree::inorder() const

templateinline void bstree::postorder() const

templateinline void bstree::clear()

templateinline bsnode* bstree::max()

templateinline bsnode* bstree::min()

templateinline void bstree::insert(bsnode* pfindnode, bsnode* pinsertnode)

else

insert(pfindnode->lchild, pinsertnode);

} else

else

insert(pfindnode->rchild, pinsertnode); }}

templateinline bsnode* bstree::search(bsnode* proot, const t & data) const

templateinline void bstree::remove(bsnode* pfind, bsnode* pparent)

else if (pfind->lchild == nullptr)//如果左子樹為空

else//如果都不為空

pfind->data = s->data;

if (par == pfind) //如果pfind的右孩子就是大於pfind值的最小值結點

par->rchild = s->rchild;

else

par->lchild = s->rchild;

if(s->rchild)

s->rchild->parent = par;

delete s;

return;

} }else //如果要刪除的值在右半部分

else if (pfind->lchild == nullptr)//如果左子樹為空

else//如果都不為空

pfind->data = s->data;

if (par == pfind) //如果pfind的右孩子就是小於pfind值的最大值結點

par->lchild = s->lchild;

else

par->rchild = s->lchild;

if(s->lchild)

s->lchild->parent = par;

delete s;

return;

} }delete pfind;

}templateinline void bstree::preorder(bsnode* proot) const

}templateinline void bstree::inorder(bsnode* proot)const

}templateinline void bstree::postorder(bsnode* proot)const

}templateinline void bstree::clear(bsnode*& proot)

}templateinline bsnode* bstree::max(bsnode* proot)

templateinline bsnode* bstree::min(bsnode* proot)

#include#include"bstree.h"

using namespace std;

int main()

; int n = sizeof(arr) / sizeof(int);

for (int i = 0; i < n; ++i)

cout << "刪除前:";

test.preorder(); cout << endl;

bsnode* find = test.search(1);

test.remove(find->data);

cout << "刪除1 :"; test.preorder(); cout << endl;

test.remove(-3);

cout << "刪除-3:"; test.preorder(); cout << endl;

test.remove(-6);

cout << "刪除-6:"; test.preorder(); cout << endl;

test.remove(9);

cout << "刪除9 :"; test.preorder(); cout << endl;

test.remove(-2);

cout << "刪除-2:"; test.preorder(); cout << endl;

test.remove(0);

cout << "刪除0 :"; test.preorder(); cout << endl;

資料結構之二叉搜尋樹

什麼是二叉搜尋樹呢?它與別的資料結構相比其優勢又是什麼呢?一顆二叉搜尋樹就是以一顆二叉樹來組織和儲存資料的,如圖所示 圖a是包含6個節點 高度為2的二叉樹,圖b是包含相同關鍵字 高度為4的低效二叉樹 對比博文前面所介紹的鍊錶,二叉樹也是可以用結構體來實現,只不過每個節點裡面不僅要儲存資料本身的關鍵字...

資料結構之二叉樹實現

1.二叉樹的原理分析 樹是一種重要的非線性資料結構,直觀地看,它是資料元素 在樹中稱為結點 按分支關係組織起來的結構。二叉樹 binary tree 是每個節點最多有兩個子樹的有序樹。通常子樹被稱作 左子樹 和 右子樹 二叉樹演算法的排序規則 1 選擇第乙個元素作為根節點 2 之後如果元素大於根節點...

資料結構與演算法之二叉搜尋樹

看到有個傢伙寫的很好 二叉查詢樹 二 之 c 的實現 二叉搜尋樹的定義 一棵二叉樹,可能為空 一棵非空的二叉搜尋樹滿足以下特徵 每個元素有乙個關鍵字,並且任意兩個元素的關鍵字都不同,因此,所有的關鍵字都是唯一的。在根節點的左子樹中,元素的關鍵字 如果有的話 都小於根節點的關鍵字。在根節點的右子樹中,...