1.删除叶节点:删除该节点,并使该节点的父结点指向NULL 2.要删除的节点只有一个孩子:将其父节点的指针指向要删除的孩子节点 3.要删除的节点有左右两棵子树:取右子树中最小的元素替代or取左子树中最大的元素替代 返回左子树删除了x这个节点后新的左子树根结点的地址 平衡二叉树 不同的插入次序形成的搜索树: ...
在平衡二叉树中进行插入操作时只需从插入节点之父向上检查,发现不平衡便立即调整,调整一次平衡即可;而进行删除操作时需要一直从删除节点之父向上检查,发现不平衡便立即调整,然后继续向上检查,直到树根。 【算法步骤】 ① 在平衡二叉树中查找x ,如果查找失败,则返回;如果查找成功,则执行删除操作(同二叉查找树的删除操...
经观察可以发现,整棵树才是非平衡二叉树,所以从根节点,沿着路径画三个节点,将这三个节点调整为平衡二叉树 调整完毕后剩下的节点按照平衡二叉树的规则填补进去即可 二.删除操作 要求:二叉树的高度不增加 1.直接删除叶子节点 2.被删除的节点无左子树,就让右子树的根节点代替 3.被删除节点无右子树,就让左子树的根...
增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。 平衡因子pf 等于左子树深度减右子树深度 性质: 它或者是颗空树,或者是具有下列性质的二叉树: 它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。 若将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的...
1)删除叶子结点; 2)删除左子树为空,右子树不为空的结点: 3)删除左子树不为空,右子树为空的结点; 4)删除左右子树都不为空的结点。 删除叶子结点很简单,直接删除即可,此处不再赘述。接下来分别学习其他三种删除情况。 左子树为空,有子树不为空 以图中的平衡二叉树为例。
平衡二叉树的删除操作 删除的旋转和二叉树的插入的旋转类型,可以参考文章末尾的历史文章,删除操作如果遇到失衡,此时需要旋转,旋转也有四种情况,LL,LR,RR和RL型,判断类型也是通过平衡因子。如果一个节点的平衡因子大于1,此时为LR或者LL类型。如果当前节点的左孩子的平衡因子大于等于0,此情况为LL,否则为LR。
二、删除 2.1 删除的单旋操作 2.2 删除的双旋操作 本文假设读者熟悉BST(搜索二叉树)的插入与删除。(可以看B站邓俊辉老师的《数据结构(C++版)》) 本文规定平衡因子: 左子树高度右子树高度BalFac(x)=左子树高度−右子树高度 一、插入 假设我们插入一个节点,然后沿着这个节点的祖先一路向上找到的第一一 个失衡的...
平衡二叉树就是任意二叉排序树两个子树直接的深度不大于1的树,平衡二叉树插入后可能会出现不平衡,因而就需要调整,对应有LL,LR,RR,RL四种情况,同样平衡二叉树删除后也需要进行调整。 平衡二叉树删除的流程: 删除结点(和二叉排序树相同) 如果结点时叶结点直接删 ...
[i]);}}//***平衡二叉树的删除***voidDelete2(AVL_node*p,AVL_node*&p2){if(p2->rchild)Delete2(p,p2->rchild);else{p->data=p2->data;AVL_node*temp=p2;p2=p2->lchild;deletetemp;temp=NULL;}if(p2)p2->heigh=std::max(GetHeigh(p2->lchild),GetHeigh(p2->rchild))+1;}voidDelete(AVL...
不久前小编分享了平衡二叉树的创建以及插入操作,类似于添加操作,从平衡二叉树中删除节点也分为两步,第一步完成节点的删除,第二步找到因为删除而导致不满足平衡二叉树要求的子树并对其进行调整。虽然平衡二叉树的结点删除操作的代码比较复杂,但是经过认真分析后,可以发现删除过程只有以下3种情况:...