二叉树插入算法--递归

对于BST而言,插入一个节点主要是要保持其“小-中-大”的逻辑不变,因此插入的节点的逻辑可以从根节点开始,一步步寻找新节点的“最终归宿”,比如在如下BST中,要插入新节点16,最终应该插入到节点17的左孩子处。
在这里插入图片描述

在实现插入算法的时候,由于树状结构本身是递归的,因此可以使用递归函数更优雅地实现插入算法。如下:
情况①:
第一次插入节点给这个二叉树
二叉树是空的,则直接把Root根指针指向新节点
struct node *Root=NULL;
Root = bstInsert(Root,25);

对应插入代码为:
if(root == NULL)
return new;
情况②:
非第一次插入节点
递进深入二叉树

递进的条件:
只要节点的Lchild或Rchild不为NULL 则以下一个节点作为根 继续深入
回归的条件:
到了 尾巴为NULL 同时满足大小关系条件 则返回当前节点地址

代码:

//构建二叉树节点
typedef struct bst
{
    //数据域
    int data;
    //指针域
    struct bst *lchild;
    struct bst *rchild;
}BST, *pBST;
//二叉树插入算法
pBST bstInsert(pBST root, int data)
{
    //0.申请空间
    pBST Newnode = (pBST)malloc(sizeof(BST));
    //1.数据域赋值
    Newnode->data = data;
    //2.指针域赋值
    Newnode->lchild = NULL;
    Newnode->rchild = NULL;
    // 若此时BST为空,则Newnode称为二叉树的根节点
    if(root == NULL)
        return Newnode; //只要满足这个条件就开始回归
     // 若新节点比根节点小,那么新节点应该插入左子树中
    // 至于插入到左子树的具体什么位置就不用管了,直接递归即可
    if(data < root->data)
        root->lchild = bstInsert(root->lchild, data);
      // 若新节点比根节点大,那么新节点应该插入右子树中
    // 至于插入到右子树的具体什么位置就不用管了,直接递归即可
    else if(data > root->data)
        root->rchild = bstInsert(root->rchild, data);
    // 若已存在,则不处理
    else
        printf("节点已存在");
    free(Newnode);
    return root;
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢仕冲的一亩三分地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值