【C语言数据结构】树之二叉搜索树



前言

从二分查找的顺序与二分搜索树(判定树)比较可以看出:
1、每次的mid取值相当于搜索树每个节点。
2、每个值的查找次数相当于该值在搜索书所在节点的层数。
3、查找成功时查找次数不会超过判断数的深度[logn] +1。
4、平均查找次数 = 累加(层节点数 * 层数) / 总节点数 = ASL。


一、二叉搜索树

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

typedef char TreeElem;
typedef TreeElem ElemType;

// 二插搜索树的数据结构
typedef struct BSTNode{
	TreeElem data;
	struct BSTNode * lchild;
	struct BSTNode * rchild;
}BSTNode, *BiTree;

BSTNode * BST_Search(BiTree T, ElemType key); // 二插排序树的查找
int BST_Insert(BiTree &T, ElemType key); // 二插排序树的插入 
void Create_BST(BiTree &T, ElemType str[], int n); // 二插排序树的构建 
void PreOrder(BiTree T); // 先序遍历
void InOrder(BiTree T); // 中序遍历
void PostOrder(BiTree T); // 后续遍历
void visit(BiTree T); // 访问树的节点 
int PostOrderGetHeight(BiTree &T); // 树的高度 

void visit(BiTree T) {
	printf("%c ", T->data);
}

// 根左右。 先序遍历 
void PreOrder(BiTree T) {
	if (T != NULL) {
		visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
}

// 左根右。中序遍历 
void InOrder(BiTree T) {
	if (T != NULL) {
		InOrder(T->lchild);
		visit(T);
		InOrder(T->rchild);
	}
}

// 左右根。后序遍历 
void PostOrder(BiTree T) {
	if (T != NULL) {
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		visit(T);
	}
}

// 二叉树的查找 
BSTNode * BST_search(BiTree T, ElemType key) {
	while(T != NULL && key != T->data) {
		// 如果关键值小于节点则去左节点 
		if (key < T->data) T = T->lchild;
		// 如果关键值大于节点则去右节点 
		else T = T->rchild;
	}
	return T;
}

// 二叉树的插入 
int BST_Insert(BiTree &T, ElemType key) {
	// 递归跳出条件节点为空 
	if (T == NULL) {
		// 节点为空创建一个节点 
		T = (BiTree)malloc(sizeof(BSTNode));
		// 将关键值赋予该节点 
		T->data = key;
		// 节点的儿子的节点都为空
		T->lchild = T->rchild = NULL;
		// 插入成功 
		return 1; 
	} else if(T->data == key) {
		// 关键值存在插入失败 
		return 0;
	} else if(T->data < key) {
		// 如果关键值大于那么递归去找右子树 
		return BST_Insert(T->rchild, key);
	} else {
		return BST_Insert(T->lchild, key);
	}
}

//二叉树的高度
int PostOrderGetHeight(BiTree &T) {
	int HL, HR, MaxH;
	if (T) {
		HL = PostOrderGetHeight(T->lchild);
		HR = PostOrderGetHeight(T->rchild);
		MaxH = ( HL > HR ) ? HL : HR;
		return ( MaxH + 1 );
	}
	else return 0;
}

// 创建二叉树 
void Create_BST(BiTree &T, ElemType str[], int n) {
	T == NULL;
	int i = 0;
	while (i < n) {
		BST_Insert(T, str[i]);
		i++;
	}
}

int main() {
	BiTree T = NULL, result;
	char str[10] = {'5', '3', '7', '2', '4', '6', '8', '9', '\0'};
	Create_BST(T, str, strlen(str));
	printf("先序遍历:"); 
	PreOrder(T);
	putchar('\n'); 
	printf("中序遍历:");
	InOrder(T);  // 中序输出就是有顺序的字符串
	putchar('\n'); 
	printf("后序遍历:");
	PostOrder(T);  // 中序输出就是有顺序的字符串
	putchar('\n');
	int height;
	height = PostOrderGetHeight(T);
	std::cout<<height;
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值