数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)

数据结构作业模板存档

#include<stdio.h>
#include <cstdlib>
#include <iostream>
#include <stack>
#include<queue>
using namespace std;

//二叉树定义
typedef char ElementType;

typedef struct BiTreeNode
{
    ElementType data;
    struct BiTreeNode* lchild;
    struct BiTreeNode* rchild;
} BiTreeNode, *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 creatBiTree_2(BiTree &rt,int n)///层序遍历建树
{
    char root[2];
    scanf("%s",root);
    rt=new BiTreeNode;
    rt->data=root[0];
    for(int i=2; i<=n; i++)
    {
        BiTreeNode* T=rt;
        char tmp[2];
        int num=0,a[16];
        scanf("%s",tmp);
        int ii=i;
        while(ii)
        {
            a[num++]=ii%2;
            ii/=2;
        }
        BiTreeNode *node=new BiTreeNode;
        node->data=tmp[0];
        node->rchild=NULL;
        node->lchild=NULL;
        for(int j=num-2; j>0; j--)
            if(a[j])T=T->rchild;
            else T=T->lchild;
        if(a[0])T->rchild=node;
        else T->lchild=node;
    }
}
int Nodenum(BiTreeNode* root)//二叉树节点数目
{
    if(root == NULL) return 0;
    else return 1+Nodenum(root->lchild)+Nodenum(root->rchild);
}
//递归销毁一棵二叉树
void destroyBiTree(BiTree &T)
{
    if(T)
    {
        destroyBiTree(T->lchild);
        destroyBiTree(T->rchild);
        delete T;
        T = NULL;
    }
}

//递归先序遍历二叉树
void preOrderTraverse(const BiTree &T)
{
    if(T)
    {
//        cout<<T->data<<" ";//输出根节点值
        printf("%c ",T->data);
        preOrderTraverse(T->lchild);//遍历左子树
        preOrderTraverse(T->rchild);//遍历右子树
    }
}

//递归中序遍历二叉树
void inOrderTraverse(const BiTree &T)
{
    if(T)
    {
        inOrderTraverse(T->lchild);//遍历左子树
//        cout<<T->data<<" ";//输出根节点值
        printf("%c ",T->data);
        inOrderTraverse(T->rchild);//遍历右子树
    }
}

//递归后序遍历二叉树
void postOrderTraverse(const BiTree &T)
{
    if(T)
    {
        postOrderTraverse(T->lchild);//遍历左子树
        postOrderTraverse(T->rchild);//遍历右子树
        printf("%c ",T->data);
//        cout<<T->data<<" ";//输出根节点值
    }
}

//递归求树的深度
int depthOfBiTree(const BiTree &T)
{
    int ldepth;
    int rdepth;

    if(T==NULL)//空树
        return 0;
    ldepth = depthOfBiTree(T->lchild);
    rdepth = depthOfBiTree(T->rchild);

    return (ldepth>rdepth)?(ldepth+1):(rdepth+1);
}

//递归求二叉树的叶子结点个数
int leafCountOfBiTree(const BiTree &T)
{
    if(T==NULL)
        return 0;
    if(T->lchild==NULL && T->rchild==NULL)
        return 1;
    return leafCountOfBiTree(T->lchild) + leafCountOfBiTree(T->rchild);
}

void exchangeChild(BiTree &T)///交换左右子树
{
    if(T)
    {
        BiTree temp = NULL;

        if(T->lchild ||T->rchild)
        {
            temp = T->lchild;
            T->lchild = T->rchild;
            T->rchild = temp;
            exchangeChild(T->lchild);
            exchangeChild(T->rchild);
        }
    }
}
void LevelOrderTraverse(BiTree T)///层序遍历
{
    //Visit是对节点操作的应用函数,
    //在这里,对每个数据元素调用函数Visit,也即是遍历了该节点
    queue<BiTree>q;
    BiTree p;
    if(T)
    {
        q.push(T);
        while(!q.empty())
        {
            p=q.front();
            q.pop();
            printf("%c ",p->data);
            if(p->lchild!=NULL) q.push(p->lchild);
            if(p->rchild!=NULL) q.push(p->rchild);
        }
        printf("\n");
    }
}
int main()
{
    BiTree T = NULL;

    createBiTree(T);//建立二叉树 AB#D##CE###

    printf("先序遍历: "); //先序遍历
    preOrderTraverse(T);
    printf("\n");

    printf("中序遍历: ");//中序遍历
    inOrderTraverse(T);
    printf("\n");

    printf("后序遍历: ");//后序遍历
    postOrderTraverse(T);
    printf("\n");

    printf("层序遍历: ");
    LevelOrderTraverse(T);

    printf("交换左右子树: \n");
    exchangeChild(T);

    printf("先序遍历: "); //先序遍历
    preOrderTraverse(T);
    printf("\n");

    printf("中序遍历: ");//中序遍历
    inOrderTraverse(T);
    printf("\n");

    printf("后序遍历: ");//后序遍历
    postOrderTraverse(T);
    printf("\n");

    printf("层序遍历: ");
    LevelOrderTraverse(T);

    printf("深度: %d\n",depthOfBiTree(T));//树的高度

    printf("叶子结点数: %d\n",leafCountOfBiTree(T));//叶子结点数

    printf("总结点数量: %d\n",Nodenum(T));
    destroyBiTree(T);//销毁二叉树,释放空间

///================================================================

    int n;
    scanf("%d",&n);
    BiTree TT=NULL;
    creatBiTree_2(TT,n);

    printf("先序遍历: "); //先序遍历
    preOrderTraverse(TT);
    printf("\n");

    printf("中序遍历: ");//中序遍历
    inOrderTraverse(TT);
    printf("\n");

    printf("后序遍历: ");//后序遍历
    postOrderTraverse(TT);
    printf("\n");


    printf("深度: %d\n",depthOfBiTree(TT));//树的高度

    printf("叶子结点数: %d\n",leafCountOfBiTree(TT));//叶子结点数

    printf("总结点数量: %d\n",Nodenum(TT));
    destroyBiTree(TT);//销毁二叉树,释放空间
    system("PAUSE");
    return EXIT_SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值