关于树的操作,大部分都是使用递归的思想。只有层序构建二叉树时需要注意一下,它通过使用队列的方式记录每一个节点,当一个节点有孩子节点时,就将孩子节点添加到队列中。当队列为空时,则说明二叉树建立完毕。具体操作都在代码中。
#include <iostream>
#include <queue>
using namespace std;
typedef struct node{
char data;
node *lchild,*rchild;
//节点中包含节点的数值和其左右两个节点的地址
}*bitTree;//注意这里bittree改名的写法
//注意用结构体里的数据时 用 -> 好过 .
//先序方式构造
void create_tree(bitTree &T)
//注意这里传入的是树的地址
{
char c;
cin>>c;
if(c == '0') T = NULL;
else
{
T = new node;//在构造树时,需要new一个新的节点才可以对他们进行赋值
T -> data = c;
create_tree(T->lchild);
create_tree(T->rchild);
}
}
//层序方式形成二叉树
void layer_create_tree (bitTree &T)
{
char c;
cin >> c;
queue<bitTree> nodes;
bitTree n;//用来保存每一个节点
if(c == '0'){
T = NULL;
}else{
T = new node;//注意需要new node
T->data = c;
T->lchild = T->rchild = NULL;
nodes.push(T); //入队
}
//通过对队列的输出,对每一个节点的左右孩子节点都做一个定义
//每次队列都是那一层中的节点
while(!nodes.empty())
{
n = nodes.front();
nodes.pop();
cin>>c;
if(c == '0'){
n->lchild = NULL;
}else{
n->lchild = new node;
n->lchild->data = c;
n->lchild->lchild = n->lchild->rchild = NULL;
nodes.push(T->lchild);//新加入的节点都要入栈
}
char d;
cin>>d;
if(d == '0'){
n->rchild = NULL;
}else{
n->rchild = new node;
n->rchild->data = d;
n->rchild->lchild = n->rchild->lchild = NULL;
nodes.push(n->rchild);//新加入的节点都要入栈
}
}
}
void preorder(bitTree T)
{//先序遍历
if(T!=NULL)
{
cout<<T->data<<" ";
preorder(T->lchild);
preorder(T->rchild);
}
}
void midorder(bitTree T)
{//中序遍历
if(T!=NULL)
{
midorder(T->lchild);
cout<<T->data<<" ";
midorder(T->rchild);
}
}
void rearorder(bitTree T)
{
if(T!=NULL)
{
rearorder(T->lchild);
rearorder(T->rchild);
cout<<T->data<<" ";
}
}
int count_leaf(bitTree T)//叶子节点数
{
if(T == NULL) return 0;
if(T->lchild==NULL&&T->rchild==NULL)
{
return 1;
}else{
return count_leaf(T->lchild)+count_leaf(T->rchild);
}
//判断当前节点左右两个字节点为叶子节点的个数后返回
//因为不断的递归,最终就是根节点左右两子树中叶子节点的个数
}
int count_deep(bitTree T)//深度
{
int sum;
if(T){
//count_deep(T->lchild);
// return max(count_deep(T->lchild),count_deep(T->rchild))+1;
return count_deep(T->lchild)+1;
//递归中的加法需要在每一层有实质的加数
}else{
return 0;//空树的节点为零
}
}
void test()
{
queue<bitTree> nodes;
bitTree n,m;
// create_tree(n);
// create_tree(m);
n = new node;
m = new node;
n->data = 'a';
n->lchild = n->rchild = NULL;
m->data = 'a';
m->lchild = m->rchild = NULL;
nodes.push(n);
nodes.push(m);
cout<<"ok"<<endl;
rearorder(nodes.front());//队列可以将树作为类型传入
}
int main()
{
// test();
bitTree t;
//create_tree(t);//先序创建
layer_create_tree(t);//层序创建
cout<<"先序遍历:";
preorder(t);
cout<<endl;
cout<<"中序遍历:" ;
midorder(t);
cout<<endl;
cout<<"后序遍历:";
rearorder(t);
cout<<endl;
cout<<"叶子节点个数:"<<count_leaf(t)<<endl;
cout<<"深度:"<<count_deep(t)<<endl;
}