对于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; }