二叉查找树
对任何节点x,其左子树中的关键字最大不超过key[x],右子树中的关键字最小不小于key[x]。 二叉查找树这种数据结构,它支持多种动态集合操作,search,minimum,maximum,predecessor(前驱),successor(后继),insert以及delete。在二叉查找树上执行的基本操作时间与树的高度成正比。对于一棵含有n个节点的完全二叉树,这些操作的最坏情况的运行时间为O(lgn)。这点明显优于含有n个节点的线性链(线性链上执行这些操作最坏时间代价为O(n))。
C语言实现
这里通过随机生成100个整数并执行插入操作从而构建二叉查找树。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define SIZE 100
struct TreeNode
{
int value;
TreeNode* parent;
TreeNode* left;
TreeNode* right;
};
//T表示根节点
TreeNode* T = NULL;
TreeNode *x, *y;
TreeNode* treeInsert(TreeNode* T, int value)
{
//根据节点值创建一个新的节点
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode -> value = value;
newNode -> parent = NULL;
newNode -> left = NULL;
newNode -> right = NULL;
if (T == NULL) //还是一个空树
{
T = newNode;
}
else
{
y = NULL;
x = T;
while (x != NULL)
{
y = x;
if (newNode -> value < x -> value)
x = x -> left;
else
x = x -> right;
}
newNode -> parent = y;
if (newNode -> value < y -> value)
y -> left = newNode;
else
y -> right = newNode;
}
return T;
}
//中序遍历二叉查找树,从小到大输出所有节点
void inorderTreeWalk(TreeNode* x)
{
if (x != NULL)
{
inorderTreeWalk(x -> left);
printf("%d\n", x -> value);
inorderTreeWalk(x -> right);
}
}
//寻找BST中的最大元素
int findMax(TreeNode* T)
{
while (T -> right != NULL)
{
T = T -> right;
}
return T -> value;
}
//寻找BST中的最小元素
int findMin(TreeNode* T)
{
while (T -> left != NULL)
{
T = T -> left;
}
return T -> value;
}
int main()
{
int a[SIZE];
for (int i = 0; i < SIZE; i ++)
{
a[i] = rand();
printf("第%d个随机数是:%d\n", i, a[i]);
}
//生成随机数,插入节点
for (int i = 0; i < SIZE; i ++)
{
T = treeInsert(T, a[i]);
}
printf("插入完成\n");
printf("中序遍历的结果是:\n");
inorderTreeWalk(T);
int max = findMax(T);
printf("最大值是:%d\n", max);
int min = findMin(T);
printf("最小值是:%d\n", min);
getch();
return 0;
}