一、二叉排序樹
二叉排序樹也稱二叉查找樹,是學習數據結構樹的第一步,其主要性質如下:
(1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
(3)左、右子樹也分別爲二叉排序樹
(4)無等值節點
對二叉排序樹的操作包括:
1.樹的創建(節點插入)
2.樹的遍歷(前序,中序,後序)
3.樹中節點的刪除
樹的結構體爲:
struct Tree
{
int val;
Tree *left;
Tree *right;
Tree(int x) : val(x), left(NULL), right(NULL)
{
}
};
樹的建立和插入的代碼:
void insert(int val, Tree *root) //val爲要插入的節點權值,root爲根節點指針
{
if (val == root->val){ return; }
if (val < root->val&&root->left == NULL){
root->left = new Tree(val);
}
if (val < root->val&&root->left != NULL){
insert(val, root->left);
}
if (val>root->val&&root->right == NULL){
root->right = new Tree(val);
}
if (val>root->val&&root->right != NULL){
insert(val, root->right);
}
}
先序,中序,後序遍歷的函數爲:
void xianxu(Tree *root)
{
cout << root->val << " ";
if (root->left != NULL)
{
xianxu(root->left);
}
if (root->right != NULL)
{
xianxu(root->right);
}
}
void zhongxu(Tree *root)
{
if (root->left)
{
zhongxu(root->left);
}
cout << root->val << " ";
if (root->right)
{
zhongxu(root->right);
}
}
void houxu(Tree *root)
{
if (root->left)
{
houxu(root->left);
}
if (root->right)
{
houxu(root->right);
}
cout << root->val << " ";
}
二叉樹的節點刪除要分情況討論
情況一:
要刪除的節點爲葉子結點無左子樹和右子樹
操作:
直接刪去該節點
情況二:
要刪除的節點只有一個子樹(左子樹或者右子樹)
操作:
將父節點指向刪除節點的指針指向那個單一的子樹
情況三:
要刪除的節點有兩個子樹(左子樹和右子樹)
操作:
遍歷刪除節點的左子樹(或者右子樹),找到最大的左子樹節點(或者最小的右子樹節點),改爲遞歸刪除該節點(左最小或者右最大)並將該節點的val賦值給刪除的節點。