对于每一个结点:
- 如果
val == 结点值
:说明有重复的值,不进行插入 - 如果
val < 结点值
:需要判断能否进行左转- 如果左子树不为空,向左转
- 如果左子树 为空,说明已到达终点(不能左转),便将结点作为其左孩子插入
- 如果
val > 结点值
:需要判断能否进行右转- 如果右子树不为空,向右转
- 如果右子树 为空,说明已到达终点(不能右转),便将结点作为其右孩子插入
// 二叉排序树:插入(迭代版,不记录父节点)
bool BST::insert(KeyType val) {
// 需处理T为NULL的情况,否则算法失效
if(T == NULL)
return T = new NODE{val, nullptr, nullptr}; // 左右孩子为空
/*对于每一个结点:
如果val == 结点值:说明有重复的值,不进行插入
如果val < 结点值:需要判断能否进行左转
如果左子树不为空,向左转
如果左子树 为空,说明已到达终点(不能左转),便将结点作为其左孩子插入
如果val > 结点值:需要判断能否进行右转
如果右子树不为空,向右转
如果右子树 为空,说明已到达终点(不能右转),便将结点作为其右孩子插入
*/
PNODE p = T;
while(true) {
if(val == p->data) {
return false;
} else
if(val < p->data) {
if(p->lchild)
p = p->lchild;
else
return p->lchild = new NODE{val, nullptr, nullptr};
} else
if(val > p->data) {
if(p->rchild)
p = p->rchild;
else
return p->rchild = new NODE{val, nullptr, nullptr};
}
}
}