一、二叉排序树
若左子树非空,则左子树上所有结点的值均小于根结点的值
若右子树非空,则右子树上所有结点的值均大于等于根结点的值
其左右子树本身各是一个二叉排序树
如上图所示,这就是一个二叉排序树
二、二叉排序树的创建与操作
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);
}