首页 > 其他分享 >15.5二叉排序树原理及建树实战

15.5二叉排序树原理及建树实战

时间:2023-04-11 14:35:38浏览次数:46  
标签:15.5 parent BST BiTree KeyType 二叉 key 排序

#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;
}
//二叉排序树的创建,中序遍历,查找
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");
    }
    return 0;
}

 

标签:15.5,parent,BST,BiTree,KeyType,二叉,key,排序
From: https://www.cnblogs.com/su-1007/p/17306092.html

相关文章

  • 【剑指 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......
  • 7、归并排序
    1、归并排序归并排序:O(N*logN)publicclassMergeSort{privateMergeSort(){}/***归并排序*/publicstatic<EextendsComparable<E>>voidsort(E[]arr){sort(arr,0,arr.length-1);}/***归并排序ar......
  • android-RecyclerView实现拖动排序
    android:RecyclerView实现拖动排序最近项目中需要实现对某一类条目进行拖动排序功能,实现技术方案就是利用ItemTouchHelper绑定RecyclerView、ItemTouchHelper.Callback来实现UI更新,并且实现动态控制是否开启拖动功能。其中,ItemTouchHelper是Google在support-v7包中添加的,其于Rec......