數據結構之樹的應用梳理(一)二叉排序樹

一、二叉排序樹


二叉排序樹也稱二叉查找樹,是學習數據結構樹的第一步,其主要性質如下:
(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賦值給刪除的節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章