顺序存储结构
#include <stdio.h>
//用顺序数组的形式,存储建立一个二叉搜索树
/*
1,我们根据完全二叉树的编号,我们做数组角标1存储输入的第一个元素
2,得到根元素之后,我们开始建立这样的二叉树
若元素的值大于根节点,则将元素往根节点的右子节点移动,若此节点为空
那么,存入,否则,直到找到这个空位置
若元素的值小于根节点,按么则将元素往根节点的左子节点移动,直到找到
空位存储之
注意,如何寻找节点的左右子节点呢?
用左节点为父节点×2,右子节点为父节点×2+1,
根据这个关系,找到角标,存储之。
*/
void create_btree(int b_tree[], int nodelist[], int len) {
int i;
int level;//树的层级,我们用这个level去推进计算将要插入的数字的角标,
//直白的说,就是确定它的树中位置
b_tree[1] = nodelist[1];
for (i = 2;i < len;i++) {
level = 1;//每一个新元素在二叉搜索树的位置都是通过根节点进行搜索
while (b_tree[level] != 0) {//0表示当前的子树位置是空的
if (nodelist[i] < b_tree[level]) {
level = level * 2;
}
else {
level = level * 2 + 1;
}
}
//出了循环,说明新元素在二叉搜索树中的位置就定下了
b_tree[level] = nodelist[i];
}
}
//若一棵树的左子树所有的值都比根节点的值小,右子树的值都比根大
//这样的二叉树,我们成为二叉查找树(Binary search tree)
int main1(void){
int b_tree[16] = { 0 };
int nodelist[16] = { 0, 6,3,8,
5,2,9,4,7,
10,0,0,0,
0,0,0};//根据角标的定义,我们的数组形式不用0开始做编号
create_btree(b_tree, nodelist, 16);
for (int i = 1;i < 16;i++) {
printf("%d,[%d] \n", i, b_tree[i]);
}
getchar();
return 0;
}
链式存储结构
#include <stdio.h>
#include <stdlib.h>
typedef int datatype ;
typedef struct node {
datatype data;
struct node *left, *right;
}BitTree;
//辅助队列Q,这是用来存关系的
BitTree* Q[16];//这是一个指针数组,它将缓存节点的地址,因为这个地址将以
//left域,或者right域进入二叉链表,它本身不维护i,2i,2i+1的关系
//他的关系通过front,rear来维护
//按照直观的建立,我们首先想到的是层次法
//我们根据层次,来逐一将二叉树建立
//输入的数组是按照完全二叉树的编号规则设立,即
//数组角标反映了节点位置关系(存联系)
//逐个扫描数组,直到所有的节点都存取完毕之后,就结束
//约定,0表示数组当前元素为空,最后一个节点标志是-999
BitTree* CreateBinTree(int arr[]) {
int i = 1;
//只要我们没有扫描完元素,那么这个二叉链表就没有完成
//只要扫描,我们就malloc一个节点,然后把这个节点存入left域或者right域
int front = 1, rear = 0;
BitTree* root = NULL;
BitTree* s;//暂存节点
while (arr[i]!=-999) {
s = NULL;
if (arr[i] != 0) {//意味着这个不是空节点,那么我们就要分配空间
s = (BitTree*)malloc(sizeof(BitTree));
s->data = arr[i];//存数值
s->left = NULL;
s->right = NULL;
}
//要让我们新节点入队,进入缓存,等待分配双亲的left域和right域
Q[++rear] = s;
if (rear == 1)
{
root = s;
}
else {
if (s != NULL && Q[front]) {
if (rear % 2 == 0) {
Q[front]->left = s;
}
else {
Q[front]->right = s;
}
}
if (rear % 2 == 1)
front++;
}
i++;
}
return root;
}
//树遍历问题:非线性结构的输出问题:前序,中序,后序
void inorder(BitTree *t) {
if (t) {
inorder(t->left);
printf("%d ", t->data);
inorder(t->right);
}
}
void preorder(BitTree* t) {
if (t) {
//根左右
printf("%d ", t->data);
preorder(t->left);
preorder(t->right);
}
}
void postorder(BitTree* t) {
if (t) {
//左右根
postorder(t->left);
postorder(t->right);
printf("%d ", t->data);
}
}
int main(void) {
int arr[17] = {0,6,3,8,
2,5,7,9,
0,0,4,0,
0,0,0,10,
-999
};
BitTree *root = CreateBinTree(arr);
inorder(root);
getchar();
return 0;
}
二叉排序树的查找
二叉排序树的插入
二叉排序树的删除