1、存储结构
二叉树的结构是非线性的, 每一结点最多可有两个后继。
二叉树的存储结构有两种: 顺序存储结构和链式存储结构
2、遍历方式
3、代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
typedef struct point
{
char data;
struct point *left, *right;
}tree,*lt;
char s[101];
int i = 0;
lt bulitTree()//先序建立二叉树 注意空结点的数量和位置
{
lt s1 = NULL;
s1 = (lt)malloc(sizeof(tree));
s1->data = s[i++];
if (s1->data == ' ')
{
free(s1);
s1 = NULL;
return NULL;
}
s1->left = bulitTree();
s1->right = bulitTree();
return s1;
}
void FirstSequence(lt p)//先序遍历二叉树
{
if (p)
{
printf("%c", p->data);
FirstSequence(p->left);
FirstSequence(p->right);
}
}
void Postorder(lt p)//后序遍历二叉树
{
if (p)
{
Postorder(p->left);
Postorder(p->right);
printf("%c", p->data);
}
}
void Inorder(lt h)//中序遍历二叉树
{
if (h)
{
Inorder(h->left);
printf("%c", h->data);
Inorder(h->right);
}
}
int Degree(lt p)//先序二叉树的深度
{
int max, h1, h2;
if (p)
{
h1 = Degree(p->left);
h2 = Degree(p->right);
max = h1 > h2 ? h1 : h2;
return max + 1;
}
else
{
return 0;
}
}
int Leaf(lt p)//二叉树的叶子数
{
if (p == NULL)
return 0;
else if (p->left == NULL && p->right == NULL)
return 1;
else return Leaf(p->left) + Leaf(p->right);
}
void exchange(lt p)//交换左右子树
{
lt T = NULL;
if (p->left == NULL && p->right == NULL)
return;
else
{
T = p->left;
p->left = p->right;
p->right = T;
}
if (p->left)
exchange(p->left);
if (p->right)
exchange(p->right);
}
int main()//主函数;
{
lt h = NULL;
int x = 0;;
int max = 0, ycount = 0;
int p = 0;
while (1)
{
printf("***************************************************\n");
printf("\t\t输入 0 表示退出菜单!\n");
printf("\t\t输入 1 表示建立二叉树!\n");
printf("\t\t输入 2 表示先序、中序、后序遍历二叉树:递归算法\n");
printf("\t\t输入 3 表述求二叉树的高度!\n");
printf("\t\t输入 4 表示求二叉树的叶子个数!\n");;
printf("\t\t输入 5 表示交换左右子树!\n");
printf("****************************************************\n"); \
printf("请输入一个菜单数!\n");
scanf("%d", &x);
switch (x)
{
case 0:
return 0;
case 1:
printf("请输入一串字符\" \"表述空节点!\n例如\"ABD CE F \":\n");
p = 1;
getchar();
gets(s);
h = bulitTree();
printf("创建成功!\n");
break;
case 2:
if (p == 0)
{
printf("请选择 1 建立二叉树!\n");
break;
}
printf("先序遍历二叉树!\n");
FirstSequence(h);
printf("\n");
printf("中序遍历二叉树!\n");
Inorder(h);
printf("\n");
printf("后续遍历二叉树!\n");
Postorder(h);
printf("\n");
break;
case 3:
if (p == 0)
{
printf("请选择 1 建立二叉树!\n");
break;
}
printf("数的深度!\n");
max = Degree(h);
printf("%d\n", max);
break;
case 4:
if (p == 0)
{
printf("请选择 1 建立二叉树!\n");
break;
}
printf("树叶子的个数!\n");
ycount = Leaf(h);
printf("%d\n", ycount);
break;
case 5:
if (p == 0)
{
printf("请选择 1 建立二叉树!\n");
break;
}
exchange(h);
printf("交换左右子树成功!交换后的序列为:\n");
printf("先序遍历二叉树!\n");
FirstSequence(h);
printf("\n");
printf("中序遍历二叉树!\n");
Inorder(h);
printf("\n");
printf("后续遍历二叉树!\n");
Postorder(h);
printf("\n");
break;
default:
printf("请输入合法数字!\n");
}
}
return 0;
}