#include<bits/stdc++.h>
#define maxsize 100
using namespace std;
typedef struct node
{//定义二叉树结构
    char data;
    struct node *lchild,*rchild;
}*bitree,bitnode;

void createbitree(bitree &t)
{//先序创建二叉树
    char ch;
    cin>>ch;
    if(ch=='#') t=null;
    else{
        t=new bitnode;
        t->data=ch;
        createbitree(t->lchild);
        createbitree(t->rchild);
    }
}
//层序遍历
void levelordertraversal(bitree bt){
    queue<bitree> q;
    if(!bt)return;
    q.push(bt);
    while(!q.empty()){
        bitnode *q = q.front();
        cout<<q->data;
        q.pop();
        if(q->lchild)
            q.push(q->lchild);
        if(q->rchild)
            q.push(q->rchild);
    }
}
void inordertraverse(bitree t)
{//中序遍历
    if(t)
    {
        inordertraverse(t->lchild);
        cout<<t->data;
        inordertraverse(t->rchild);
    }
}
void preordertraverse(bitree t)
{//先序遍历
    if(t)
    {
        cout<<t->data;
        preordertraverse(t->lchild);
        preordertraverse(t->rchild);
    }
}
void postordertraverse(bitree t)
{//后序遍历
    if(t)
    {
        postordertraverse(t->lchild);
        postordertraverse(t->rchild);
        cout<<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
    {
        int m=depth(t->lchild);
        int n=depth(t->rchild);
        if(m>n) return (m+1);
        else return (n+1);
    }
}
int nodecount(bitree t)
{//统计二叉树中结点的个数
    if(t==null) return 0;
    else return nodecount(t->lchild)+nodecount(t->rchild)+1;
}
int leafcount(bitree t)
{//统计二叉树中叶子结点的个数
    if(!t) return 0;
    if(!t->lchild &&!t->rchild){//如果二叉树左子树和右子树皆为空,说明该二叉树根节点为叶子节点,加1.
        return 1;
    }else{
        return leafcount(t->lchild)+leafcount(t->rchild);
    }
}
int node_1_count(bitree t)
{//统计二叉树的度为1的结点个数
    if(!t) return 0;
    if((!t->lchild)&&(t->rchild)||(t->lchild)&&(!t->rchild))
        return 1;
    else
        return leafcount(t->lchild)+leafcount(t->rchild);
}
void printallpath(bitree t, char path[], int pathlen)
{//二叉树中从每个叶子结点到根结点的路径
    int i;
    if(t != null) {
        path[pathlen] = t->data; //将当前结点放入路径中
        if(t->lchild == null && t->rchild == null) {//叶子结点
            for(i = pathlen; i >= 0; i--)
                cout << path[i] << " " ;
            cout << endl;
        }else{
            printallpath(t->lchild, path, pathlen + 1);
            printallpath(t->rchild, path, pathlen + 1);
        }
    }
}
void exchangetree(bitree &t)
{//构造函数,使用递归算法进行左右结点转换
    bitree temp;
    if(t!=null){//判断t是否为空,非空进行转换,否则不转换
        temp=t->lchild;
        t->lchild=t->rchild;//直接交换节点地址
        t->rchild=temp;
        exchangetree(t->lchild);
        exchangetree(t->rchild);
    }
}
void dblordertraverse(bitree t)
{//二叉树的双序遍历
    if(t)
    {
        cout<<t->data;
        dblordertraverse(t->lchild);
        cout<<t->data;//访问两遍
        dblordertraverse(t->rchild);
    }
}
int main()
{
    bitree t;
    //测试例子ab#cd##e##f#gh###
    cout<<"先序遍历输入(以#结束):";
    createbitree(t);
    cout<<"中序遍历输出:";
    inordertraverse(t);
    cout<<endl<<"先序遍历输出:";
    preordertraverse(t);
    cout<<endl<<"后序遍历输出:";
    postordertraverse(t);
    cout<<endl<<"层序遍历输出:";
    levelordertraversal(t);
    cout<<endl<<"树的深度:"<<depth(t);
    cout<<endl<<"结点的个数:"<<nodecount(t);
    cout<<endl<<"叶结点的个数:"<<leafcount(t);
    cout<<endl<<"度为1的结点个数:"<<node_1_count(t);
    cout<<endl<<"二叉树中从每个叶子结点到根结点的所有路径:"<<endl;
    char path[256];
    int pathlen=0;
    printallpath(t,path,pathlen);//
    //交换二叉树每个结点的左孩子和右孩子
    bitree tem=t;//直接复制一颗树,在不改变原树的前提下,对临时树进行交换。
    exchangetree(tem);
    cout<<"先序遍历输出交换后的结果:";
    preordertraverse(tem);
    cout<<endl<<"双序遍历输出:";
    dblordertraverse(t);
    return 0;
}
分类: 未分类

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注