代码都是书上的。
需要注意的是怎么输入。

第一行 为自己输入的数据,在创建的二叉树中数据域为char型,故空格和enter键也会被存入二叉树数据中。‘#’号总比二叉树数据结点多一个,不然一直在输入,无法进入输出。输出是中序遍历打印的。

根据上面的输入数据可以画出自己创建的二叉树(上图)。这是草稿纸上的操作,代码结果只输出中序遍历结果。
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BiTNode
{
char data;//结点的数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
void CreateTree(BiTree &T)//创建二叉树,这里是先序遍历的顺序建立的二叉链表 递归形式
{
char ch,trmp;
scanf("%c",&ch);//输入链表数据
if(ch == '#')//如果出现输入的是#,终止递归。终止递归条件
T = NULL;
else
{
T = (BiTNode*)malloc(sizeof(BiTNode));//申请一个根结点
T->data = ch;//对根结点进行赋值
CreateTree(T->lchild);//递归创建左子树
CreateTree(T->rchild);//递归创建右子树
}
}
bool TreeEmpty(BiTree T)//判断二叉树是否为空
{
if(T == NULL)//bool类型,如果二叉树为空,返回true,否则返回false
return true;
return false;
}
void InOrderTraverse(BiTree T)//打印二叉树 ,中序遍历二叉树的递归算法
{
if(T)//递归终止条件是T为NULL
{
InOrderTraverse(T->lchild);//中序遍历左子树
printf("%c ",T->data);//输出打印根结点
InOrderTraverse(T->rchild);//中序遍历右子树
}
}
void CopyTree(BiTree T,BiTree &NewT)//复制一颗和T完全相同的二叉树
{
if(T == NULL)//递归终止条件
{
NewT = NULL;
return ;
}
else
{
NewT = (BiTNode*)malloc(sizeof(BiTNode));//申请一个根结点
NewT->data = T->data;//复制根结点
CopyTree(T->lchild,NewT->lchild);//递归复制左子树
CopyTree(T->rchild,NewT->rchild);//递归复制右子树
}
}
int Depth(BiTree T)//计算二叉树T的深度
{
int m = 0,
n = 0;//定义两个变量
if(TreeEmpty(T))//递归终止条件
return 0;
else
{
m = Depth(T->lchild);//递归计算左子树的深度记为m
n = Depth(T->rchild);//递归计算右子树的深度记为n
if(m>n)//二叉树的深度为m与n的较大者加1
return m+1;
return n+1;
}
}
int NodeCount(BiTree T)//统计二叉树T中的结点的个数
{
if(T == NULL)//递归终止条件
return 0;
else//结点个数为左子树的结点个数+右子树的结点个数
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int main()
{
BiTree T;//创建一个空二叉树
CreateTree(T);// 创建二叉树
InOrderTraverse(T);//打印二叉树 中序遍历
printf("\n");
BiTree NewT;//创建一个新二叉树
CopyTree(T,NewT);//复制二叉树
InOrderTraverse(NewT);
printf("\n");
printf("%d\n",Depth(T));//二叉树T的深度
printf("%d\n",NodeCount(T));//二叉树的结点个数
return 0;
}
(完)

1万+

被折叠的 条评论
为什么被折叠?



