版权声明:转载必须注明出处,违者必究。 https://blog.csdn.net/qq_41856518/article/details/85242238
二叉树是最简单也是最常用的树,下面我用二叉链表的形式创建一颗二叉树,并将其分别用前序、中序、后序遍历,然后求其叶子节点数和深度。
#include<iostream>
#include<cmath>
using namespace std;
struct binode //定义节点结构体
{
char data;
binode *lchild;
binode *rchild;
};
class bitree
{
public:
binode *root;
bitree(){root=creattree(root);}
~bitree(){}
binode *creattree(binode *bt) //创建树
{
char ch;
cin>>ch;
if(ch=='#')bt=NULL; //输入“#”代表空
else
{
bt=new binode; //为要创建的节点开辟空间
bt->data=ch;
bt->lchild=creattree(bt->lchild); //递归创建左子树
bt->rchild=creattree(bt->rchild); //递归创建右子树
}
return bt;
}
void preoder(binode *bt) //前序遍历
{
if(!bt)return;
else
{
cout<<bt->data<<" "; //根节点
preoder(bt->lchild); //左子树
preoder(bt->rchild); //右子树
}
}
void inoder(binode *bt) //中序遍历
{
if(!bt)return;
else
{
inoder(bt->lchild); //左子树
cout<<bt->data<<" "; //根节点
inoder(bt->rchild); //右子树
}
}
void postoder(binode *bt) //后序遍历
{
if(!bt)return ;
else
{
postoder(bt->lchild); //右子树
postoder(bt->rchild); //左子树
cout<<bt->data<<" "; //根节点
}
}
int leaves(binode *bt) //求叶子节点数
{
if(!bt)return 0;
if(!bt->lchild&&!bt->rchild)return 1;//左子树和右子树都为空,即叶子节点
else return leaves(bt->lchild)+leaves(bt->rchild);
}
int depth(binode *bt) //求树的深度
{
if(!bt)return 0;
int m=depth(bt->lchild);
int n=depth(bt->rchild);
return max(m,n)+1;
}
};
int main()
{
bitree t;
cout<<"前序遍历为:";
t.preoder(t.root);cout<<endl;
cout<<"中序遍历为:";
t.inoder(t.root);cout<<endl;
cout<<"后序遍历为:";
t.postoder(t.root);cout<<endl;
cout<<"叶子节点数为:"<<t.leaves(t.root)<<endl;
cout<<"树的深度为:"<<t.depth(t.root)<<endl;
}
运行截图: