二叉树插入算法--递归

简介: 二叉树插入算法--递归

对于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;
}
相关文章
|
1月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
1月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
1月前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
1月前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
2月前
|
算法 Python
python中算法递归错误(Recursion Errors)
【7月更文挑战第18天】
40 1
|
1月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
60 0
|
1月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
32 0
|
2月前
|
算法
刷算法Leetcode---9(二叉树篇Ⅲ)
刷算法Leetcode---9(二叉树篇Ⅲ)
27 3
|
3月前
|
算法 分布式数据库
【数据结构和算法】--- 二叉树(5)--二叉树OJ题
【数据结构和算法】--- 二叉树(5)--二叉树OJ题
31 1
|
2月前
|
算法 JavaScript
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
32 0