创建一个二叉排序树(Binary Search Tree)

发布时间 2023-09-29 17:37:19作者: Guanjie255

一、二叉排序树的定义

  1. 左子树所有结点的值均小于根结点的值
  2. 右子树所有结点的值均大于根节点的值
  3. 左子树和右子树也是二叉排序树

1.二叉排序树的结点结构

typedef struct BSTNode {
	/*二叉排序树的结点结构*/
	int value;
	struct BSTNode *left;
	struct BSTNode *right;
} BSTNode, *BST;

2.二叉排序树示例

二、向二叉排序树插入一个结点

void insert(BST T, int v) {
	/*二叉排序树上插入值为v的一个结点*/
	if (T != NULL) {
		if (T->value < v && T->right == NULL) {
			/*当前结点是合适的插入位置*/
			T->right = (BSTNode*)malloc(sizeof(BSTNode));
			T->right->value = v;
			T->right->left = NULL;
			T->right->right = NULL;
		} else if (T->value > v && T->left == NULL) {
			/*当前结点是合适的插入位置*/
			T->left = (BSTNode*)malloc(sizeof(BSTNode));
			T->left->value = v;
			T->left->left = NULL;
			T->left->right = NULL;
		} else if (T->value < v && T->right != NULL) {
			/*当前结点不是合适的插入位置,继续在右子树上寻找插入位置*/
			insert(T->right, v);
		} else if (T->value > v && T->left != NULL) {
			/*当前结点不是合适的插入位置,继续在右子树上寻找插入位置*/
			insert(T->left, v);
		}
	} 
}

三、运行结果

第一行输入节点数量
第二行输入每个节点的数据域
后三行输出先序、中序、后序遍历序列

四、完整C代码

点击查看代码
#include <stdio.h>
#include <stdlib.h>

typedef struct BSTNode {
	/*二叉排序树的结点结构*/
	int value;
	struct BSTNode *left;
	struct BSTNode *right;
} BSTNode, *BST;

void insert(BST T, int v);
void visit(BSTNode* node);
void preOrder(BST T);
void inOrder(BST T);
void postOrder(BST T);

int main(int argc, char* argv[]) {
	/*定义结点数量n和二叉排序树bst*/
	int n;
	BST bst;	

	/*向空二叉树T中插入n个结点*/
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		int v;
		scanf("%d", &v);
		if (i != 0) {
			insert(bst, v);
		} else {
			/*利用第一个输入的值v初始化bst的根结点*/
			bst = (BST)malloc(sizeof(BSTNode));
			bst->left = NULL;
			bst->right = NULL;
			bst->value = v;
		}
	}

	/*先序遍历bst*/
	printf("preOrder  : ");
	preOrder(bst);
	printf("\n");

	/*中序遍历bst*/
	printf("inOrder   : ");
	inOrder(bst);
	printf("\n");
	
	/*后序遍历bst*/
	printf("postOrder : ");
	postOrder(bst);
	printf("\n");

	return 0;
}

void insert(BST T, int v) {
	/*二叉排序树上插入值为v的一个结点*/
	if (T != NULL) {
		if (T->value < v && T->right == NULL) {
			/*当前结点是合适的插入位置*/
			T->right = (BSTNode*)malloc(sizeof(BSTNode));
			T->right->value = v;
			T->right->left = NULL;
			T->right->right = NULL;
		} else if (T->value > v && T->left == NULL) {
			/*当前结点是合适的插入位置*/
			T->left = (BSTNode*)malloc(sizeof(BSTNode));
			T->left->value = v;
			T->left->left = NULL;
			T->left->right = NULL;
		} else if (T->value < v && T->right != NULL) {
			/*当前结点不是合适的插入位置,继续在右子树上寻找插入位置*/
			insert(T->right, v);
		} else if (T->value > v && T->left != NULL) {
			/*当前结点不是合适的插入位置,继续在右子树上寻找插入位置*/
			insert(T->left, v);
		}
	} 
}

void preOrder(BST T) {
	/*先序遍历BST*/
	if (T != NULL) {
		visit(T);
		preOrder(T->left);
		preOrder(T->right);
	}
}

void inOrder(BST T) {
	/*中序遍历BST*/
	if (T != NULL) {
		inOrder(T->left);
		visit(T);
		inOrder(T->right);
	}
}

void postOrder(BST T) {
	/*后序遍历BST*/
	if (T != NULL) {
		postOrder(T->left);
		postOrder(T->right);
		visit(T);
	}
}

void visit(BSTNode* node) {
	/*访问二叉排序树的某一个结点*/
	printf("%d ", node->value);
}