二叉樹的順序存儲
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
#define max 16
typedef struct BinaryNode{
ElemType data[max];? ? ? ? ? ? //創建存儲數組
int size;? ? ? ? ? ? ? ? ? ? ? //數組的大小
}binarytree;
//初始化二叉樹
void init(binarytree *T)
{
for (int i = 0; i < max; i++){
T->data[i] = NULL; ? ? ? ? //將數組全部置為空并設置長度為0
}
T->size = 0;
}
//層次遍歷創建二叉樹
void creattree(binarytree *T)
{
ElemType n;
printf("當前為第%d個結點,請輸入結點的值:", T->size);
n = getchar();
T->data[T->size] = n;
T->size++;
if (T->size == 20)
return;
if (n == '*')
return;
else{
n = getchar();? ? ? ? ? //吸收回車符
creattree(T);
}
}
//層次遍歷打印
void Cprintftree(binarytree *T, int n)
{
for (; n<T->size; n++)
{
if (T->data[n] == NULL || T->data[n] == '*')
return;
else{
if (T->data[n] != '#')
printf("%c", T->data[n]);
}
}
}
//先序打印二叉樹
void Rprintftree(binarytree *T, int n)
{
if (T->data[n] == NULL || T->data[n] == '*' || T->data[n] == '#')
return;
printf("%c", T->data[n]);
Rprintftree(T, 2 * n + 1);
Rprintftree(T, 2 * (n + 1));
}
//中序打印二叉樹
void Zprintftree(binarytree *T, int n)
{
if (T->data[n] == NULL || T->data[n] == '*' || T->data[n] == '#')
return;
Zprintftree(T, 2 * n + 1);
printf("%c", T->data[n]);
Zprintftree(T, 2 * (n + 1));
}
//后序打印二叉樹
void Hprintftree(binarytree *T, int n)
{
if (T->data[n] == NULL || T->data[n] == '*' || T->data[n] == '#')
return;
Hprintftree(T, 2 * n + 1);
Hprintftree(T, 2 * (n + 1));
printf("%c", T->data[n]);
}
//求結點數
int node(binarytree *T)
{
int num = 0;
for (int n = 0; n<T->size; n++)
{
if ((T->data[n] != NULL) && (T->data[n] != '#') && (T->data[n] != '*'))
{
num++;
}
}
return num;
}
//計算葉子結點數
int leaf(binarytree *T)
{
int num = 0;
for (int n = 0; n<T->size; n++)
{
if ((T->data[n] != NULL) && (T->data[n] != '#') && (T->data[n] != '*') && (T->data[2 * n + 1] == NULL) && (T->data[2 * (n + 1)] == NULL))
{
num++;
}
}
return num + 1;
}
int main()
{
binarytree T;
int n = 0;
init(&T);
printf("請從上到下從左往右輸入結點的值,空結點用#代替當結束時用*,你最多可以輸入%d個:\n", max);
creattree(&T);
printf("樹得結點數為%d\n", node(&T));
printf("樹得葉子結點數為%d\n", leaf(&T));
printf("樹層次遍歷結構的是:");
Cprintftree(&T, n);
printf("\n樹先序遍歷結構的是:");
Rprintftree(&T, n);
printf("\n樹中序遍歷結構的是:");
Zprintftree(&T, n);
printf("\n樹后序遍歷結構的是:");
Hprintftree(&T, n);
return 0;
}
二叉樹的鏈式存儲
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct BinaryTreeNode{
ElemType Date;
struct BinaryTreeNode *lChild, *rChild;
}BinaryTreeNode,*BiTree;
//先序遍歷(PLR):依次訪問根結點,左子樹,右子樹
void PreOrderTransverse(BiTree t)
{
if (t == NULL)
return;
printf("%c", t->Date); //打印輸出根結點
PreOrderTransverse(t->lChild); //然后先序遍歷左子樹
PreOrderTransverse(t->rChild); //最后先序遍歷右子樹
}
//中序遍歷(LPR):依次訪問左子樹,根結點,右子樹
void InOrderTransverse(BiTree t)
{
if (t == NULL)
return;
InOrderTransverse(t->lChild); //中序遍歷根結點的左子樹
printf("%c", t->Date); //打印輸出根結點
InOrderTransverse(t->rChild); //最后中序遍歷右子樹
}
//后序遍歷(LRP):依次訪問左子樹,右子樹,根結點
void PostOrderTransverse(BiTree t)
{
if (t == NULL)
return;
PostOrderTransverse(t->lChild); //后序遍歷根結點的左子樹
PostOrderTransverse(t->rChild); //然后后序遍歷根結點的右子樹
printf("%c", t->Date); //打印輸出根結點
}
//先序遍歷方法構建二叉樹
BinaryTreeNode *PreCreateBt(BinaryTreeNode *t)
{
char ch;
ch = getchar();
if (ch == '#') //輸入為#表示這里建立空二叉樹,即遍歷算法的空操作
t = NULL;
else
{
t = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
t->Date = ch; //構造根結點
t->lChild = PreCreateBt(t->lChild); //構造左子樹
t->rChild = PreCreateBt(t->rChild); //構造右子樹
}
return t;
}
//計算葉子數(度為0的結點)
int leaf(BiTree t)
{
int num1 = 0, num2 = 0;
if (t == NULL)
return 0;
if (t->lChild == NULL && t->rChild == NULL)
return 1;
else
{
num1++;
leaf(t->lChild);
num2++;
leaf(t->rChild);
}
return num1 + num2 + 1;
}
//結點數(樹中的元素)
int node(BiTree t)
{
int num1, num2;
if (!t)
return 0;
if (t->lChild == NULL && t->rChild == NULL)
return 1;
else
{
num1 = node(t->lChild);
num2 = node(t->rChild);
}
return num1 + num2 + 1;
}
//復制二叉樹
BiTree copy(BiTree t)
{
BiTree t1;
if (!t)
return NULL;
else
{
t1 = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
t1->Date = t->Date;
t1->lChild = t->lChild = copy(t->lChild);
t1->rChild = t->rChild = copy(t->rChild);
return t1;
}
}
//左右子樹交換
void chage(BiTree t)
{
BiTree p;
if (!t)
return;
else
{
chage(t->lChild);
chage(t->rChild);
p = t->lChild;
t->lChild = t->rChild;
t->rChild = p;
}
}
int main()
{
BiTree t = NULL,t2;
printf("請輸入樹的數據:\n");
t = PreCreateBt(t);
printf("該樹先序遍歷:");
PreOrderTransverse(t);
printf("\n該樹中序遍歷:");
InOrderTransverse(t);
printf("\n該樹后序遍歷:");
PostOrderTransverse(t);
printf("\n");
printf("葉子數:%d\n", leaf(t));
printf("結點數:%d\n", node(t));
t2 = copy(t);
printf("復制樹先序遍歷:");
PreOrderTransverse(t2);
printf("\n左右子樹交換后樹的先序遍歷");
chage(t);
PreOrderTransverse(t);
printf("\n");
}