#include <stdio.h>
typedef struct BiTNode
{
//****
char data;
struct BiTNode *lchild, *rchild;
int left,right;
}BiTNode, *BiTree;
void CreateBiTree(BiTree &T)
{
char ch;
ch=getchar();
if(ch=='#')
{
T=NULL;
return;
}
T= new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
void PreOrderTraverse(BiTree T)
{
if(!T) {return;}
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree T)
{
if(!T) {return;}
PreOrderTraverse(T->lchild);
printf("%c",T->data);
PreOrderTraverse(T->rchild);
}
void PostOrderTraverse(BiTree T)
{
if(!T) {return;}
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf("%c",T->data);
}
void Copy(BiTree T,BiTree &NewT) // 二叉树的复制
{
//****
if (T == NULL)
{
NewT = NULL;
return;
}
else
{
NewT = new BiTNode;
NewT->data = T->data;
Copy(T->lchild, NewT->lchild);
Copy(T->rchild, NewT->rchild);
}
}
int Depth(BiTree T) // 求二叉树的深度
{
//****
if(T==NULL){
return 0;
}
else{
if(Depth(T->lchild) > Depth(T->rchild)) return (Depth(T->lchild) + 1);
else return (Depth(T->rchild) + 1);
}
}
int NodeCount(BiTree T) // 求二叉树的结点个数
{
//****
if(T==NULL) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int Degree2Count(BiTree T) // 求二叉树中度为2的结点个数
{
//****
if(T==NULL) return 0;
if((T->lchild!=NULL&&T->rchild!=NULL))
return Degree2Count(T->lchild)+Degree2Count(T->rchild)+1;
else
return Degree2Count(T->lchild)+Degree2Count(T->rchild);
}
int Degree1Count(BiTree T) // 求二叉树中度为1的结点个数
{
//****
if(T==NULL) return 0;
if((T->lchild==NULL&&T->rchild!=NULL)||(T->lchild!=NULL&&T->rchild==NULL))
return Degree1Count(T->lchild)+Degree1Count(T->rchild)+1;
else
return Degree1Count(T->lchild)+Degree1Count(T->rchild);
}
int LeavesCount(BiTree T) // 求二叉树中度为0的结点个数
{
//****
if(T==NULL) return 0;
if(T->lchild==NULL&&T->rchild==NULL)
return LeavesCount(T->lchild)+LeavesCount(T->rchild)+1;
else
return LeavesCount(T->lchild)+LeavesCount(T->rchild);
}
int IsEqual(BiTree T1,BiTree T2) //判断两个二叉树是否相同,相同返回1,不相同返回0
{
//****
if(T1==NULL&&T2==NULL)
return 1;
else if(T1==NULL||T2==NULL)
return 0;
if(T1->data!=T2->data)
return 0;
int left, right;
left=IsEqual(T1->lchild, T2->lchild);
right=IsEqual(T1->rchild, T2->rchild);
return left&&right;
}
void Swap(BiTree &T) // 交换二叉树中所有结点的左右孩子
{
//****
{
BiTree temp;
if(T){
temp = T-> lchild;
T-> lchild = T-> rchild;
T-> rchild = temp;
Swap(T-> lchild);
Swap(T-> rchild);
}
}
}
//****
void OutputLeavesPath(BiTree T) // 输出所有叶子结点的路径
{
//****
if (T!=NULL)
{
if (T->lchild==NULL && T->rchild==NULL)
printf("%c ",T->data);
OutputLeavesPath(T->lchild);
OutputLeavesPath(T->rchild);
}
}
int main()
{
BiTree T,V;
printf("请输入树的创建字符串: \n");
CreateBiTree(T);
printf("\n这棵树的深度是: %d",Depth(T));
printf("\n这棵树有%d个结点,其中%d个度为2的结点,%d个度为1的结点,%d个叶子结点。\n",
NodeCount(T),Degree2Count(T),Degree1Count(T),LeavesCount(T));
printf("\n它的先序遍历结果是: ");
PreOrderTraverse(T);
printf("\n中序遍历结果是: ");
InOrderTraverse(T);
printf("\n后序遍历结果是: ");
PostOrderTraverse(T);
Copy(T,V);
if(IsEqual(T,V)) printf("\n复制后的树和原来的树是相等的。");
else printf("\n复制后的树和原来的树是不相等的?");
printf("\n树中各叶子结点的路径如下:\n");
OutputLeavesPath(T);
Swap(V);
printf("\n交换后的树先序遍历结果是: ");
PreOrderTraverse(V);
printf("\n中序遍历结果是: ");
InOrderTraverse(V);
printf("\n后序遍历结果是: ");
PostOrderTraverse(V);
if(IsEqual(T,V)) printf("\n交换后的树和原来的树是相等的?");
else printf("\n交换后的树和原来的树是不相等的。");
return 0;
}