二叉排序树(创建、搜索)

一、二叉排序树

若左子树非空,则左子树上所有结点的值均小于根结点的值
若右子树非空,则右子树上所有结点的值均大于等于根结点的值
其左右子树本身各是一个二叉排序树

在这里插入图片描述
如上图所示,这就是一个二叉排序树

二、二叉排序树的创建与操作

BinSortTree.h文件

#ifndef BINTREE_H_INCLUDED
#define BINTREE_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;

/** 二叉排序树结点 */
typedef struct treenode
{
    ElementType data;
    struct treenode * leftchild;
    struct treenode * rightchild;
}TreeNode,*BinTree;

/** 初始化二叉排序树 */
void InitBinSortTree(BinTree * treeNode);

/**
  * 创建二叉排序树,根据一维数组
  * @param low 最小位置
  * @param high 最大位置
  */
void CreatBinSortTree(BinTree * treeNode, ElementType * elementArray, int low, int high);

/** 中序遍历 */
void InOrderTraverse(TreeNode * node);

/** 以关键字key查找二叉数中,查找的的结点以node返回 */
void SearchBST(BinTree treeNode, int key, TreeNode ** node);

/** 向二叉排序树插入元素 */
void InsertBST(BinTree * treeNode, ElementType element);

/** 测试二叉排序树 */
void TestBinSortTree();

#endif // BINTREE_H_INCLUDED

BinSortTree.c文件

二叉排序树的创建类似于二分法,就是每一次新的根结点都记录的是当前区间的中间值,如果录入的数字大于mid,那么就递归调用右子树,反之递归调用左子树

#include "BinTree.h"

/** 初始化二叉排序树 */
void InitBinSortTree(BinTree * treeNode)
{
    (*treeNode) = (TreeNode *)malloc(sizeof(TreeNode));
    (*treeNode)->leftchild = NULL;
    (*treeNode)->rightchild = NULL;
}

/**
  * 创建二叉排序树,根据一维数组
  * @param low 最小位置
  * @param high 最大位置
  */
void CreatBinSortTree(BinTree * treeNode, ElementType * elementArray, int low, int high)
{
    if(low > high)
        return;
    int mid = (low + high) / 2;
    //如果树为空,需要重新初始化
    if(!(*treeNode))
    {
        (*treeNode) = (TreeNode *)malloc(sizeof(TreeNode));
        (*treeNode)->leftchild = NULL;
        (*treeNode)->rightchild = NULL;
    }
    (*treeNode)->data = elementArray[mid];
    //递归创建左子树
    CreatBinSortTree(&((*treeNode)->leftchild), elementArray, low, mid-1);
    //递归创建右子树
    CreatBinSortTree(&((*treeNode)->rightchild), elementArray, mid+1, high);

}

/** 中序遍历 */
void InOrderTraverse(TreeNode * node)
{
    if(node)
    {
        InOrderTraverse(node->leftchild);
        printf("%d\n",node->data);
        InOrderTraverse(node->rightchild);
    }
}

/** 以关键字key查找二叉数中,查找的的结点以node返回 */
void SearchBST(BinTree treeNode, int key, TreeNode ** node)
{
    if(!treeNode || key == treeNode->data)
        *node = treeNode;
    else if(key < treeNode->data)
        SearchBST(treeNode->leftchild, key, node);
    else
        SearchBST(treeNode->rightchild, key, node);
}

/** 向二叉排序树插入元素 */
void InsertBST(BinTree * treeNode, ElementType element)
{
    //找到可以插入空节点
    if(!(*treeNode))
    {
        TreeNode * newNode = (BinTree)malloc(sizeof(TreeNode));
        newNode->data = element;
        newNode->leftchild = NULL;
        newNode->rightchild = NULL;
        *treeNode = newNode;
    }
    else if(element < (*treeNode)->data)
        InsertBST(&((*treeNode)->leftchild),element);
    else
        InsertBST(&((*treeNode)->rightchild),element);
}

/** 测试二叉排序树 */
void TestBinSortTree()
{
    ElementType elementArray[10] = {1, 2, 3, 4, 5};
    //如果需要在子函数中分配空间,那么就需要传入指针的指针
    BinTree tree;
    InitBinSortTree(&tree);
    CreatBinSortTree(&tree,elementArray,0,4);
    InOrderTraverse(tree);

    ElementType key = 8;
    //用node来接收关键结点,那么这个node就需要分配空间
    TreeNode * node = (TreeNode *)malloc(sizeof(TreeNode));
    //如果需要在子函数中为这个空间赋值,那么就需要传入这个指针的指针
    SearchBST(tree, key, &node);
    if(node)
        printf("%d\n",node->data);
    else
    {
        printf("No Find!\n");
        InsertBST(&tree, key);
        InOrderTraverse(tree);
    }
    free(node);
}

猜你喜欢

转载自blog.csdn.net/qq_43327091/article/details/87986562