C 實現二叉搜尋樹基本操作(遞迴 非遞迴 應用)

2021-07-29 22:42:51 字數 4242 閱讀 5010

基本概念不再多講,看下面的例子

//結點定義

template

struct searchbinarytreenode

};//搜尋二叉樹

template

class searchbinarytree

//中序遍歷

void inorder()

//插入

bool insert(const k& key)

//2.不為空,需要找到key的位置,parent記錄上乙個結點

//因為搜尋二叉樹的結點值唯一,所以可以唯一的確認待插入的節點位置

//cur為空時,cur即為該位置

node* parent = _root;

node* cur = _root;

while (cur)

else

if (cur->_key > key)

else

return

false;

}//找到位置以後判斷鏈結關係,當父結點的值大,則鏈結在父節點左側

if (key < parent->_key)

//當父結點的值小,則鏈結在父節點右側

else

if (key > parent->_key)

else

return

false;

}bool insertr(const k& key)

//尋找

node* find(const k& key)

else

if (cur->_key < key)

else

return cur;

}return null;

}//遞迴法尋找

node* findr(const k& key)

//刪除乙個節點

bool remove(const k& key)

else

if (cur->_key < key)

else

else

}//右為空

else

if (null == cur->_right)

else

}//左右均不為空,替換法刪除

//用左子樹的最右節點或者右子樹的最左結點的值給待刪結點

//然後刪除左子樹的最右節點或者右子樹的最左結點

else

cur->_key = subleft->_key;

del = subleft;

if (subparent->_right == subleft)

subparent->_right = subleft->_left;

else

subparent->_left = subleft->_left;

}delete del;

cur = null;

return

true;}}

return

false;

}//遞迴法刪除

bool remover(const k& key)

protected:

bool _remover(node*& root, const k&key)

return

false;

}node* _findr(node* root, const k& key)

bool _insertr(node*& root, const k& key)

else

if (key > root->_key)

else

if (key < root->_key)

else

return

false;

}void _inorder(node* root)

_inorder(root->_left);

cout

<< root->_key << " ";

_inorder(root->_right);

}protected:

node* _root;

};void test()

; searchbinarytree t;

for (size_t i = 0;i < sizeof(a) / sizeof(a[0]);++i)

t.insert(12);

t.insert(-1);

t.inorder();

searchbinarytreenode* ret;

ret = t.find(8);

cout

<< "t.find(8): "

<< ret->_key << endl;

t.remove(-1);t.inorder();

t.remove(0);t.inorder();

t.remove(1);t.inorder();

t.remove(2);t.inorder();

t.remove(3);t.inorder();

t.remove(4);t.inorder();

t.remove(6);t.inorder();

t.remove(7);t.inorder();

t.remove(8);t.inorder();

t.remove(9);t.inorder();

t.remove(12);t.inorder();

t.remove(5);t.inorder();//這裡執行之後元素全部刪除,會輸出乙個空行

} void testr()

;searchbinarytree t;

for (size_t i = 0;i < sizeof(a) / sizeof(a[0]);++i)

t.insertr(12);

t.insertr(-1);

t.inorder();

searchbinarytreenode* ret;

ret = t.findr(8);

cout

<< "t.findr(8): "

<< ret->_key << endl;

t.remover(-1);t.inorder();

t.remover(0);t.inorder();

t.remover(1);t.inorder();

t.remover(2);t.inorder();

t.remover(3);t.inorder();

t.remover(4);t.inorder();

t.remover(5);t.inorder();

t.remover(6);t.inorder();

t.remover(7);t.inorder();

t.remover(8);t.inorder();

t.remover(9);t.inorder();

t.remover(12);t.inorder();//輸出空行

}//搜尋二叉樹的應用:字典實現的基本原理

//key表示主鍵,value表示其附帶資訊(即所要查詢的內容)

template

struct bstreenode

};template

class bstree

bool insert(const k& key, const v& value)

const node* find(const k& key)

return

false;

}protected:

bool _insert(node*& root, const k& key, const v& value)

else

if (key < root->_key)

else

if (key > root->_key)

else

return

false;

}protected:

node* _root;

};void testkv()

執行結果:

二叉搜尋樹(遞迴 非遞迴)

完整源 在此 1 二叉搜尋樹的概念 二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹。若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 若它的右子樹不為空,則右子樹上所有的節點的值都大於根節點的值 它的左右子樹也分為二叉搜尋樹 此二叉樹的中序遍歷結果為 0,1,2,3...

二叉搜尋樹 非遞迴)

二叉查詢樹 英語 binary search tree 也稱二叉搜尋樹 有序二叉樹 英語 ordered binary tree 排序二叉樹 英語 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 任意節點的...

非遞迴實現搜尋二叉樹

include using namespace std template struct binarysearchtreenode template class binarysearchtree binarysearchtree binarysearchtree bstree bsnode opera...