首页 > 其他 > 详细

二叉树

时间:2021-01-04 11:57:58      阅读:21      评论:0      收藏:0      [点我收藏+]

#include <iostream>
#include <stack>

using namespace std;

typedef struct bitreenode
{
  char data;
  struct bitreenode *lchild,*rchild;
}*Bitree;

//创建二叉树
void createbitree(Bitree &T)
{
  char data;
  data=getchar();
if(data==‘#‘)
{
  T=NULL;
}
else
{
  T=new bitreenode;
  T->data=data;
  createbitree(T->lchild);
  createbitree(T->rchild);
}
};

//递归的先序遍历二叉树
void preordertraverse(Bitree T)
{
if(T)
{
  cout<<T->data<<" ";//输出根结点
  preordertraverse(T->lchild);
  preordertraverse(T->rchild);
}
}

//递归的中序遍历二叉树
void inordertraverse(Bitree T)
{
if(T)
{
  inordertraverse(T->lchild);
  cout<<T->data<<" ";//输出根结点
  inordertraverse(T->rchild);
}
}

//递归的后序遍历二叉树
void postordertraverse(Bitree T)
{
if(T)
{
  postordertraverse(T->lchild);
  postordertraverse(T->rchild);
  cout<<T->data<<" ";//输出根结点
}
}

//求二叉树的深度
int depthofbitree(Bitree T)
{
  int ldepth;
  int rdepth;
if(T==NULL) //空树
{
return 0;
}

ldepth=depthofbitree(T->lchild);
rdepth=depthofbitree(T->rchild);

if(ldepth>rdepth)
return ldepth+1;
else
return rdepth+1;
}

//求二叉树的叶子结点
int leafcount(Bitree T)
{
if(T==NULL)
{
  return 0;
}
else if(T->lchild==NULL && T->rchild==NULL)
{
  return 1;
}
else
{
  int n=leafcount(T->lchild);//求左子树叶子的数目
  int m=leafcount(T->rchild);//求右子树叶子的数目
  return n+m;
  }
}

//求二叉树T中度为1的结点的数量
int onesoncount(Bitree T)
{
if(T==NULL)
{
  return 0;
}
else if((T->lchild==NULL && T->rchild!=NULL) ||(T->lchild!=NULL && T->rchild==NULL))
{
  cout<<"度为1的结点的字母为:"<<T->data<<endl;
  return (onesoncount(T->lchild) +onesoncount(T->rchild) +1);
  }
else
{
return (onesoncount(T->lchild) +onesoncount(T->rchild));
}
}

//求非叶子结点的数目
int notleafcount(Bitree T)
{
if(T==NULL)
{
  return 0;
}
else if(T->lchild == NULL && T->rchild == NULL)
return 0;
else
{
  cout<<T->data; //输出非终端结点的值
  int n=notleafcount(T->lchild); //左子树非终端结点的数目
  int m=notleafcount(T->rchild); //右子树非终端结点的数目
    return (m+n+1);
  }
}

//求二叉树的全部结点数目
int node_num(Bitree T)
{
  if(T==NULL)
  return 0;
  else
  return node_num(T->lchild)+node_num(T->rchild)+1;
}

///////////////主函数///////////////
void main()
{
  Bitree t=NULL;
  printf("请按以下两种序列输入二叉树的结点:\n");
  printf("AB#D##CE### 或 ABD##E##C#F##\n");
  createbitree(t);
  cout<<"先序遍历:";
  preordertraverse(t);
  cout<<endl;

  cout<<"中序遍历:";
  inordertraverse(t);
  cout<<endl;

  cout<<"后序遍历:";
  postordertraverse(t);
  cout<<endl;

  cout<<"二叉树的深度为:"<<depthofbitree(t)<<endl;

  int leaf=0; //叶子结点数目,初始化为0
  leaf=leafcount(t);
  cout<<"叶子结点数为:"<<leaf<<endl;

  int oneson=0; //度为1的结点数目
  oneson=onesoncount(t);
  cout<<"度为1的结点的数量为:"<<oneson<<endl;

  int notleafcount_=0; //非叶子结点的数目,初始化为0
  cout<<"非叶子结点为:";/////////////
  notleafcount_=notleafcount(t);//////////////????????
  cout<<endl;
  cout<<"非叶子结点的数量为:"<<notleafcount_<<endl;

  int node_number=0; //初始化全部结点的数目为0
  node_number=node_num(t);
  cout<<"二叉树全部结点的数量为:"<<node_number<<endl;

}

二叉树

原文:https://www.cnblogs.com/ZJS18/p/14228754.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!