#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//二叉树的建立
BiTree Create(BiTree T)
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
printf("空间分配有误!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
}
return T;
}
//二叉树的前序递归遍历
void Preorder(BiTree T)
{
if(T){
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
//统计二叉树的结点个数
int Sumleaf(BiTree T)
{
if(T==NULL){
return 0;
}else{
return Sumleaf(T->lchild)+Sumleaf(T->rchild)+1;
}
}
//二叉树的中序递归遍历
void zhongxu(BiTree T)
{
if(T){
zhongxu(T->lchild);
printf("%c",T->data);
zhongxu(T->rchild);
}
}
//二叉树的后序递归遍历
void houxu(BiTree T)
{
if(T){
houxu(T->lchild);
houxu(T->rchild);
printf("%c",T->data);
}
}
//计算二叉树的深度
int Depth(BiTree T)
{ //每一层都是先找左再找右
int m,n;
if(T==NULL){
return 0;
}else{
m=Depth(T->lchild);
n=Depth(T->rchild);
if(m>n)
return (m+1);
else
return (n+1);
}
}
//求二叉树的宽度
int treeWidth(BinaryTreeNode *pRoot) {
if (pRoot == NULL) return 0;
queue<BinaryTreeNode*> myQueue;
myQueue.push(pRoot); // 将根结点入队列
int nWidth = 1; // 二叉树的宽度
int nCurLevelWidth = 1; // 记录当前层的宽度
BinaryTreeNode *pCur = NULL;
// 队列不为空
while (!myQueue.empty()) {
while (nCurLevelWidth != 0) {
pCur = myQueue.front(); // 取出队首元素
myQueue.pop(); // 队首元素出队列
if (pCur->m_pLeft != NULL) myQueue.push(pCur->m_pLeft);
if (pCur->m_pRight != NULL) myQueue.push(pCur->m_pRight);
nCurLevelWidth--;
}
nCurLevelWidth = myQueue.size();
nWidth = nCurLevelWidth > nWidth ? nCurLevelWidth : nWidth;
}
return nWidth;
}
int main()
{
BiTree T;
int sum,dep;
T=Create(T);
Preorder(T);
printf("\n");
zhongxu(T);
printf("\n");
houxu(T);
printf("\n");
sum=Sumleaf(T);
printf("%d",sum);
dep=Depth(T);
printf("\n%d",dep);
return 0;
}
二叉树的基本操作
最新推荐文章于 2024-11-10 22:49:00 发布