插入: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 的實現 二叉搜尋樹的定義 一棵二叉樹,可能為空 一棵非空的二叉搜尋樹滿足以下特徵 每個元素有乙個關鍵字,並且任意兩個元素的關鍵字都不同,因此,所有的關鍵字都是唯一的。在根節點的左子樹中,元素的關鍵字 如果有的話 都小於根節點的關鍵字。在根節點的右子樹中,...