前言
从二分查找的顺序与二分搜索树(判定树)比较可以看出:
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;
}