二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:
若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值;
若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值;
它的左右子樹也分別為二叉搜尋樹;
bool find(const k& key) //查詢
bool insert(const k& key) //插入
node* parent = nullptr;
node* cur = _root;
while (cur)
else if (cur->_key > key)
else
}cur = new node(key);
if (parent->_key < key)
else
return true;
}
首先查詢元素是否在二叉搜尋樹中,如果不存在,則返回,否則要刪除的結點可能分為下面4中情況:
要刪除的結點無孩子節點
要刪除的結點只有左孩子結點
要刪除的結點只有右孩子結點
要刪除的結點有左、右孩子結點
要刪除結點有4種可能性,實際情況1可以與情況2或者情況3合併起來,因此刪除過程如下:
#includeusing namespace std;
templatestruct bstreenode
};templateclass bstree
node* parent = nullptr;
node* cur = _root;
while (cur)
else if (cur->_key > key)
else
}cur = new node(key);
if (parent->_key < key)
else
return true;
}bool find(const k& key) //查詢
return false;
}bool erase(const k& key) //刪除
else if (cur->_key > key)
else
else
delete cur;
}else if (cur->_right == nullptr)
else
delete cur;
}else
cur->_key = rightmin->_key;
if (rightmin == rightminparent->_left)
rightminparent->_left = rightmin->_right;
else
rightminparent->_right = rightmin->_left;
delete rightmin;
}return true;}}
return false;
}void _inorder(node* root)
void inorder() //中序遍歷
private:
node* _root = nullptr;
};void test()
; for (auto e : a)
t.inorder();
for (auto e : a)
}int main()
over! c 二叉搜尋樹 基本操作
前面我們寫過二叉樹,兩種樹基本是相同的結構,但是二叉搜尋樹又有固定的一些條件,下來我們一起看.二叉搜尋樹又稱二叉排序樹,它有兩種可能 1.空樹 2.非空樹,滿足 a.若左子樹不為空,則左子樹上所有的點都小與根節點 b.若右子樹不為空,則右子樹上所有的點都大於根節點 c.它的左右子樹也分別為二叉搜尋樹...
二叉搜尋樹的基本操作
建立乙個非負二叉搜尋樹 1表空結點 編寫查詢函式,層序遍歷函式,插入函式,刪除函式,查詢最大值最小值函式 輸入該樹和要查詢的值 輸出 如果找到,列印出 x is found 沒找到列印出 not found 列印出層序遍歷序列 刪除最大值和最小值 刪除成功輸出 x is delete 最後再進行一層...
二叉搜尋樹的基本操作
二叉搜尋樹 binary search tree 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉搜尋樹樹。節點設定 typedef int datat...