数据结构之树的应用梳理(一)二叉排序树

本文介绍了二叉排序树的基本概念,包括其性质:左子树所有节点值小于根节点,右子树所有节点值大于根节点。讨论了树的创建、插入、遍历以及节点删除的三种情况,包括删除叶子节点、单子树节点和双子树节点的处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、二叉排序树


二叉排序树也称二叉查找树,是学习数据结构树的第一步,其主要性质如下:
(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赋值给删除的节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值