美文网首页
二叉查找树删除节点

二叉查找树删除节点

作者: 小幸运Q | 来源:发表于2018-06-18 14:26 被阅读12次

如果需要删除9,则需要把9换成左子树的最右边的点6,但是删除了6,5就断了。所以要root->left不断递归(只有left为空时才能转为right递归),不断地拆东墙补西墙,最后把倒霉鬼置为NULL


image.png
#include <bits/stdc++.h>
using namespace std;
// 左支小右支大
struct Node{
    Node* left;
    Node* right;
    int num;
    Node(){
        left=NULL;
        right=NULL;
        num=0;
    }
};
// 插入
void in(Node *root,int input){
    Node*p=root;
    if(root==NULL){
        root=new Node();
        root->num=input;
        return;
    }
    while(p!=NULL){
        //cout<<"bypass"<<endl;
        if(input>(p->num)){   // 右大左小
            if(p->right==NULL){
               p->right=new Node();
               (p->right)->num=input;
               break;
            }else{
               p=p->right;
            }
        }
        else{
            if(p->left==NULL){
                p->left=new Node();
                (p->left)->num=input;
                break;
            }
            else{
                p=p->left;
            }
        }
    }
}
// 查找右子树最小的节点(仅max于num的节点)
Node* findmax(Node*root){
    while(root->left!=NULL){
        root=root->left;
    }
    return root;
}
// 查找左子树最大的节点(仅min于num的节点)
Node* findmin(Node*root){
    while(root->right!=NULL){
        root=root->right;
    }
    return root;
}
// 删除比较麻烦,需要查找小于该num或者大于该num的节点进行覆盖,但是为了避免节点置为NULL后树的通道中断了,就采取循环补漏的方式
// 将最后一个遍历到的(一般是num最左/最右)置为空,拆西墙补东墙(因为删除之后空了一个元素)。
void del(Node* &root,int num){
    //  必须用&,要不然对root的修改无法兑现
    Node* l;
    Node* r;
    if(root==NULL){
        return;
    }
    if(root->num==num){
        if(root->left==NULL&&root->right==NULL){
            root=NULL;
            return;
        }
        else if(root->left!=NULL){
            l=findmin(root->left);
            root->num=l-> num;
            //l=NULL;
            del(root->left,l->num);
        }
        else{
            r=findmax(root->right);
            root->num=r->num;
            //r=NULL;
            del(root->right,r->num);
        }
    }
    else if(root->num>num){
        del(root->left,num);
    }
    else{
        del(root->right,num);
    }
}
void preorder(Node*root){
    if(root==NULL){
        return;
    }
    printf("%d\n",root->num);
    preorder(root->left);
    preorder(root->right);
}
int main(){
    int i,j;
    int input;
    Node*root=new Node();
    scanf("%d",&input);
    root->num=input;

    for(i=0;i<6;i++){
      scanf("%d",&input);
      in(root,input);
    }
    del(root,4);
    preorder(root);
}

// 6 8 2 9 1 4 7

相关文章

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 二叉树

    1.二叉树的遍历:前序、中序、后序遍历 2.二叉树查找节点和删除节点的代码

  • 读书打卡<<算法图解-第十一章 接下来如何做>>

    1 树 1二叉查找树 二叉查找树的左边节点都比他小,右边节点都比他大从根节点开始逐步往下找 二叉查找树的查...

  • 二叉查找树归纳-查找,插入,删除

    二叉查找树主要的操作包括查找指定元素,插入元素,删除指定元素,以及寻找最小节点,最大节点,查找指定元素的前驱或后继...

  • 二叉查找树->平衡二叉树->B树->B+树

    二叉查找树->平衡二叉树->B树->B+树定义:二叉查找树的特点就是任何节点的左子节点的键值都小于当前节点的键值,...

  • 二叉查找树

    1)二叉查找树是什么?2)二叉查找树的插入、删除、查找?3)Go代码实现 一、二叉查找树是什么?二叉查找树(BST...

  • 基本算法

    预热姿势: 什么是二叉查找树 (二叉排序树) 1.红黑树 规则: 插入删除节点时的方法: 2. B-树 (也叫B树...

  • 第二十四节-二叉树基础(下)

    二叉查找树 二叉查找树又叫二叉搜索树。特点是,在树中任意一个节点,其左子树的每个节点的值,都要小于这个节点的值,而...

  • 11-二叉查找树

    二叉查找树 1.什么是二叉查找树? 二叉查找树是一种支持数据动态的插入,删除,查找的数据结构。 2.二叉查找树的设...

  • 二叉排序树:左节点 < 根节点 < 右节点(节点不相等),左右子树亦是二叉排序树。 红黑树:自平衡二叉查找树。避免...

网友评论

      本文标题:二叉查找树删除节点

      本文链接:https://www.haomeiwen.com/subject/wgdneftx.html