BinarySearchTree 二叉搜尋樹

2021-08-17 08:22:01 字數 2765 閱讀 3226

左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。

右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。

左右子樹都是二叉搜尋樹。

bool insert(const t& key)			

node* cur = _root;

node* parent = null;

while (cur)

else

if (cur->_key > key)

else

return

false;

} cur = new node(key);

if (parent->_key > cur->_key)

else

parent->_right = cur;

return

true;

}

只有乙個孩子的非葉子結點

其他結點

不是葉子結點,怎麼刪?

(讓parent和cur不為空的孩子(右孩子)連起來)

注意cur是根結點的情況(parent ==null)

判斷cur是parent 的左還是右,parent->_left(_right) = cur->_right;

cur右為空

(讓parent和cur不為空的孩子(左孩子)連起來)

注意cur是根結點的情況(parent ==null)

判斷cur是parent 的左還是右,parent->_left(_right) = cur->_left;

cur左右都不為空

找替代結點(和key大小最接近的兩個結點之一都可以),左樹的最右結點(小的裡面找最大的)或 ,右樹的最左結點(大的裡的最小的)。

找替代結點時要記錄替代結點的parent,找到替代結點後, cur->_key= sub ->_key,

然後刪除替代結點,(讓parent和替代結點不為空的孩子(右孩子)連起來)

若在左樹中找最右(最大)則替代結點的右為null,左不一定為null;

若在右樹中找最左(最小)則替代結點的左為null,右不一定為null;

bool remove(const t& key)

else

if (cur->_key > key)

else

//找到要刪的結點了

else

if (parent->_left == cur)

parent->_left = cur->_right;

else

parent->_right = cur->_right;

}else

if (cur->_right == null )//右為空

else

if (parent->_left == cur)

parent->_left = cur->_left;

else

parent->_right = cur->_left;

}else

//左右都不為空

cur->_key = sub->_key;

parent->_left = sub->_right;

del = sub;

}delete del;

return

true;

}} }

node* find

(const t& key)

node* cur = _root;

while (cur)

else

if (cur->_key > key)

else

} cout

<< "沒找到"

<< key << endl;

return

null;

}

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

if(root->_key > key)

return _insertr(root->left,key);

else

if(root->key

< key)

return _insert(root->right,key);

else

return

false;

}bool insertr(const k& key)

node* _findr(node* &root, const t& key)

if (root->_key < key)

_findr(root->_right, key);

else

if (root->_key > key)

_findr(root->_left, key);

else

}node* findr(const t& key)

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

else

if (root ->key >key)

else

if(root->key < key)

else

root->key = sub->key

; return _remover(root->right,sub->key);

}delete del;

return ture;

}}

二叉搜尋樹 Binary Search Tree

完整 二叉搜尋樹是這樣一種二叉樹,對於乙個結點x,如果它的左子樹的結點值都小於x,它的右子樹的結點值都大於x。並且他的左子樹和右子樹也滿足此特性的二叉樹。二叉搜尋樹的中序遍歷可得到資料的有序序列。bst結點的前驅是指該結點的前乙個結點,即指向該結點的結點。bst結點的後繼是指該結點的右子樹中值最接近...

二叉查詢樹 Binary Search Tree

本帖部分文字和來自於 但所有 均為原創 二叉查詢樹 英語 binary search tree 也稱二叉搜尋樹 有序二叉樹 英語 ordered binary tree 排序二叉樹 英語 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 二叉查詢樹相比於其他資料結構的優勢在...

二叉查詢樹 BinarySearchTree

一 定義tree介面public inte ce treeextends iterable二 實現抽象便利類abstracttree public abstract class abstracttreeimplements tree override public void preorder ove...