首页 > 其他分享 >15.6二叉排序树删除实战

15.6二叉排序树删除实战

时间:2023-04-11 15:27:44浏览次数:39  
标签:lchild parent 15.6 BiTree tempNode 二叉 key 排序 root

#include<stdio.h>
#include<stdlib.h>


typedef int KeyType;
typedef struct BSTNode{
    KeyType key;
    struct BSTNode *lchild,*rchild;
}BSTNode,*BiTree;

//非递归的创建二叉查找数
int BST_Insert(BiTree &T,KeyType k)
{
    BiTree TreeNew=(BiTree) calloc(1,sizeof (BSTNode));//新节点申请空间
    TreeNew->key=k;  //把值放入
    if(NULL==T)      //树为空,新结点作为树的根
    {
        T=TreeNew;
        return 0;
    }
    BiTree p=T,parent;   //用来查找树
    while (p)
    {
        parent=p;    //parent用来存p的父亲
        if(k>p->key)
        {
            p=p->rchild;
        } else if(k<p->key)
        {
            p=p->lchild;
        } else
        {
            return -1;   //相等元素不放入查找树
        }
    }
    //判断放到父亲左边还是右边
    if(k>parent->key)
    {
        parent->rchild=TreeNew;
    } else{
        //放到父亲左边
        parent->lchild=TreeNew;
    }
    return 0;
}


void Creat_BST(BiTree &T,KeyType *str,int len)
{
    int i;
    for (i = 0; i < len; i++) {
        BST_Insert(T,str[i]);    // 把某一个结点放入二叉查找树
    }
}

void InOrder(BiTree T)
{
    if(T!=NULL)
    {
        InOrder(T->lchild);
        printf("%3d",T->key);
        InOrder(T->rchild);
    }
}

BiTree BST_Search(BiTree T,KeyType k,BiTree &parent)
{
    parent=NULL;
    while (T!=NULL&&k!=T->key)
    {
        parent=T;
        if(k>T->key)
        {
            T=T->rchild;
        } else{
            T=T->lchild;
        }
    }
    return T;
}

//二叉排序树删除
void DeleteNode(BiTree &root,KeyType x)
{
    if(NULL==root)
    {
        return;
    }
    if(root->key>x)
    {
        //当前结点大于要删除的结点,往左子树找
        DeleteNode(root->lchild,x);
    }else if(root->key<x)
    {
        //当前结点小于要删除的结点,往右子树找
        DeleteNode(root->rchild,x);
    } else{
        //找到了要删除的结点
        if(root->lchild==NULL)
        {
            //左子树为空,右子树直接顶上去
            BiTree tempNode=root;
            root=root->rchild;
            free(tempNode);
        } else if(root->rchild==NULL)
        {
            //右子树为空,左子树直接顶上去
            BiTree tempNode=root;
            root=root->lchild;
            free(tempNode);
        } else{
            //两边都不为空
            /*一般的删除策略是左子树的最大数据或者右子树的最小数据代替要删除的结点
            (这里采用查找左子树最大数据来代替,最大数据是左子树的最右结点)*/
            BiTree tempNode=root->lchild;
            while (tempNode->rchild!=NULL)
            {
                tempNode=tempNode->rchild;
            }
            root->key=tempNode->key;     //把tempNode对应的值替换到要删除的值的位置上
            DeleteNode(root->lchild,tempNode->key);   //在左子树中找到tempNode的值,把其删除
        }
    }
}

//二叉排序树的创建,中序遍历,查找
int main() {
    BiTree T = NULL;   //树根
    KeyType str[7] = {54, 20, 66, 40, 28, 79, 58};  //将要进入二叉排序树的元素值
    Creat_BST(T, str, 7);
    InOrder(T);    //中序二叉查找树,由小到大
    printf("\n");
    BiTree search, parent;
    search = BST_Search(T, 40, parent);
    if (search)
    {
        printf("find key %d\n",search->key);
    } else{
        printf("not find\n");
    }
    DeleteNode(T,54);
    InOrder(T);
    printf("\n");
    return 0;
}

 

标签:lchild,parent,15.6,BiTree,tempNode,二叉,key,排序,root
From: https://www.cnblogs.com/su-1007/p/17306324.html

相关文章

  • 华为OD机试 身高排序
    本期题目:身高排序题目小明今年升学到了小学一年级,来到新班级后,发现其他小朋友身高参差不齐,然后就想基于各小朋友和自己的身高差,对他们进行排序,请帮他实现排序输入第一行为正整数H和N 0<H<200 为小明的身高 0<N<50 为新班级其他小朋友个数第二行为N个正整数......
  • 15.5二叉排序树原理及建树实战
    #include<stdio.h>#include<stdlib.h>typedefintKeyType;typedefstructBSTNode{KeyTypekey;structBSTNode*lchild,*rchild;}BSTNode,*BiTree;//非递归的创建二叉查找数intBST_Insert(BiTree&T,KeyTypek){BiTreeTreeNew=(BiTree)cal......
  • 【剑指 Offer】 33. 二叉搜索树的后序遍历序列
    【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:    5   /\  2  6 /\ 1  3示例1:输入:[1,6,3,2,5]输出:false示例2:输入:......
  • 二叉树的顺序存储
    二叉树的顺序存储二叉树的存储形式按照二叉树的结点层次编号,然依次后储存在数组当中二叉树的抽象数据类型表示二叉树顺序存储结构的示意图例题二叉树顺序存储结构的缺点1.顺序存储结构的大小固定不能动态的变化2.如果如图上为右单支树一样浪费空间所以顺序存储结构......
  • 手撕排序算法之插入排序
    前言排序算法是一种算法思想,插入排序有两种,直接插入排序和希尔排序,后者可以看作是前者的优化,因为它完完全全采用的是插入排序算法一、直接插入排序分两种情况,1.1简单插入排序在一个已经有序的数组里插入一个数据,使其依旧有序,只需要对一个元素进行插入排序,进行一次插入排序假如数组......
  • day 39 96. 不同的二叉搜索树
    给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。dp[3],就是元素1为头结点搜索树的数量+元素2为头结点搜索树的数量+元素3为头结点搜索树的数量元素1为头结点搜索树的数量=右子树有2个元......
  • Java8 - sum求和,将 List 集合转为 Map,key去重(groupingBy),sorted排序
    Java8-sum求和,将List集合转为Map,key去重(groupingBy),sorted排序packagecom.example.core.mydemo.java8;publicclassGoodsPriceDTO{privateIntegerid;privateStringgoodName;privateIntegeramount;//重写toString方法,System可以打印输出......
  • 使用benchmark比较各排序算法的性能
    #include<benchmark/benchmark.h>#include<algorithm>#include<deque>#include<iostream>#include<random>#include<vector>usingnamespacestd;staticconstint_num=10000;staticconstint_lrange=0;static......
  • 快速排序
    1.快速排序思想:分治算法 三步骤:1.找一个分界值x;       2.将小于等于x的放在左边,将大于等于x的放在右边;      3。递归左右两边;    #include<iostream>usingnamespacestd;constintN=1e5+10;voidquick_sort(intq[],intl,intr)......
  • 8、快速排序
    1、单路快速排序单路快速排序:O(N*logN)当数组中的元素一致时退化为O(n2)publicclassQuickSort{privatestaticfinalRandomRANDOM=newRandom();privateQuickSort(){}/***快速排序*/publicstatic<EextendsComparable......