二叉查找树(BST)及其C语言实现

二叉查找树

        对任何节点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;
}
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/cgz372619/article/details/8961476
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞