创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:data,lchild,rchild。静态二叉链表是用数组作为存储空间,每个数组元素存储二叉树的一个结点,也有三个字段:data,lchild,rchild。lchild和rdhild分别用于存储左右孩子的下标。
二叉树的遍历源代码
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define N 100
typedef char TElemType;
typedef struct BiTNode {
TElemType data;
struct BiTNode* lchild;//左孩子指针
struct BiTNode* rchild;//右孩子指针
int index;
}BiTNode, * BiTree;
typedef struct Tree {
char Data;
int Lchild;
int Rchild;
}TreeNode;
typedef BiTree QueueElementType;
typedef struct Node{
QueueElementType data;
struct Node* next;
} LinkQueueNode; //定义队列结点
typedef struct{
LinkQueueNode* front; //队列头结点指针
LinkQueueNode* rear; //队列尾结点指针
} LinkQueue; //定义队列
int InitQueue(LinkQueue* Q){
Q->front = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if (Q->front != NULL)
{
Q->rear = Q->front;
Q->front->next = NULL;
return 1;
}
else
return 0;//溢出
}
int EnterQueue(LinkQueue* Q, QueueElementType x){
LinkQueueNode* newnode;
newnode = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if (newnode != NULL){
newnode->data = x;
newnode->next = NULL;
Q->rear->next = newnode;
Q->rear = newnode;
return 1;
}
else return 0;
}
int DeleteQueue(LinkQueue* Q, QueueElementType* x){
LinkQueueNode* p;
if (Q->front == Q->rear)
return 0;
p = Q->front->next;
Q->front->next = p->next;
if (Q->rear == p)
Q->rear = Q->front; //如果去掉结点p后,队列为空 不要忘记将队列置空
*x = p->data;
free(p);
return 1;
}
int IsEmpty(LinkQueue* Q) {
if (Q->front == Q->rear) return 1;
else return 0;
}
static int i = 0;
//先序遍历生成二叉树
void CreateBiTree(BiTree* T) {
TElemType ch;
scanf_s("%c", &ch, 1);
if (ch == '#')
*T = NULL;
else {
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
cout << "内存分配失败!" << endl;
(*T)->data = ch;
(*T)->index = i++;
CreateBiTree(&(*T)->lchild);//左子树
CreateBiTree(&(*T)->rchild);//右子树
}
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T) {
if (T == NULL)
return;
printf("%c ", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
//中序遍历二叉树
void InOrderTraverse(BiTree T) {
if (T == NULL)
return;
InOrderTraverse(T->lchild);
printf("%c ", T->data);
InOrderTraverse(T->rchild);
}
//后序遍历二叉树
void PostOrderTraverse(BiTree T) {
if (T == NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ", T->data);
}
//层次遍历二叉树
void LayerOrder(BiTree T) {
LinkQueue Q;
BiTree p;
InitQueue(&Q);
if (T == NULL)
return ;
EnterQueue(&Q, T);
while (!IsEmpty(&Q)){
if (DeleteQueue(&Q, &p));
printf("%c ", p->data);
if (p->lchild)
EnterQueue(&Q, p->lchild);
if (p->rchild)
EnterQueue(&Q, p->rchild);
}
}
static int j = 0;
//动态二叉树转换为静态二叉链表
void Create_QuietTree(BiTree T, TreeNode a[]) {
a[j].Data = T->data;
if (T->lchild == NULL)
a[j].Lchild = 0;
else
a[j].Lchild = T->lchild->index;
if (T->rchild == NULL) {
a[j].Rchild = 0;
}
else {
a[j].Rchild = T->rchild->index;
}
j++;
if (T->lchild != NULL)
Create_QuietTree(T->lchild, &a[0]);
if (T->rchild != NULL)
Create_QuietTree(T->rchild, &a[0]);
}
//求树的深度
int BiTreeDeep(BiTree T) {
if (T == NULL)
return 0;
else {
int m = BiTreeDeep(T->lchild);
int n = BiTreeDeep(T->rchild);
if (m > n)
return (m + 1);
else
return (n + 1);
}
}
//求树的结点数
int BiTreeNodeCount(BiTree T) {
if (T == NULL)
return 0;
else
return BiTreeNodeCount(T->lchild) + BiTreeNodeCount(T->rchild) + 1;
}
//求树的叶子点数
int BiTreeLeafCount(BiTree T) {
if (!T)
return 0;
if (!T->lchild && !T->rchild)
return 1;
else
return BiTreeLeafCount(T->lchild) + BiTreeLeafCount(T->rchild);
}
int main() {
BiTree T = NULL;
TreeNode a[N];
cout << "先序遍历生成二叉树:" << endl;
CreateBiTree(&T);
Create_QuietTree(T, &a[0]);
cout << "先序遍历:" << endl;
PreOrderTraverse(T);
cout << endl;
cout << "中序遍历:" << endl;
InOrderTraverse(T);
cout << endl;
cout << "后序遍历:" << endl;
PostOrderTraverse(T);
cout << endl;
cout << "层次遍历:" << endl;
LayerOrder(T);
cout << endl;
int m = BiTreeDeep(T);
cout << "树的深度为:" << m << endl;
int n = BiTreeNodeCount(T);
cout << "树的结点数为:" << n << endl;
int k = BiTreeLeafCount(T);
cout << "树的叶子点数为:" << k << endl;
printf("说明:当左孩子或右孩子为空时,用0填充\n\n");
printf("静态二叉链表为:\n");
printf("i\tData\tLchild\tRchild\t\n");
int K;
for (K = 0; K < i; K++){
printf("%d\t%c\t%d\t%d\n", K, a[K].Data, a[K].Lchild, a[K].Rchild);
}
return 0;
}