《二叉树的练习》

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_TREE_SIZE 100    //二叉树的最大结点数

#define OK 1

typedef int Status;
typedef char DataType;
typedef struct Node
{
    DataType data;
    struct Node *lchild,*rchild;
}BinTNode,*BinTree;

Status CreateBiTree(BinTree &bt)
{//按照先序遍历次序递归建立二叉树
 //ABC##DE#G##F##
    char ch;
    scanf("%c",&ch);
    if(ch == '#')
        bt = NULL;
    else
    {
        bt = (BinTNode*)malloc(sizeof(BinTNode));
        bt->data = ch;    //生成根结点
        CreateBiTree(bt->lchild);    //构造左子树
        CreateBiTree(bt->rchild);    //构造右子树
    }
    return OK;
}

void PreOrderTraverse(BinTree bt)
{//二叉树先序遍历递归操作
    if(bt)
    {
        printf("%3c",bt->data);
        PreOrderTraverse(bt->lchild);
        PreOrderTraverse(bt->rchild);
    }
}

void InOrderTraverse(BinTree bt)
{//二叉树中序遍历递归操作
    if(bt)
    {
        InOrderTraverse(bt->lchild);
        printf("%3c",bt->data);
        InOrderTraverse(bt->rchild);
    }
}

void PosOrderTraverse(BinTree bt)
{//二叉树后序遍历递归操作
    if(bt)
    {
        PosOrderTraverse(bt->lchild);
        PosOrderTraverse(bt->rchild);
        printf("%3c",bt->data);
    }
}

void InOrder(BinTree bt)
{//二叉树中序遍历非递归操作
    BinTNode *stack[MAX_TREE_SIZE];        //定义栈数组
    int top = 0;
    stack[top] = bt;
    do
    {
        while(NULL!=stack[top])
        {//扫描根结点及其所有的左结点并入栈
            top = top+1;
            stack[top] = stack[top-1]->lchild;
        }
        top = top-1;    //退栈
        if(top>=0)    //判断栈是否为空
        {
            printf("%3c",stack[top]->data);    //访问结点
            stack[top] = stack[top]->rchild;    //扫描右子数
        }
    }while(top>=0);
    return;
}

//void PreOrder(BinTree bt)
//{//二叉树先序遍历非递归操作    
//}

int Size(BinTree bt)
{//统计二叉树中所有结点的个数
    int num1,num2;
    if(bt==NULL)
        return 0;
    else if(bt->lchild==NULL && bt->rchild==NULL)
        return 1;
    else
    {
        num1 = Size(bt->lchild);    
        num2 = Size(bt->rchild);
        return(num1+num2+1);
    }
}

int LeafCount(BinTree bt)
{//统计二叉树的叶子结点数
    int LeafNum;
    if(bt==NULL)
        LeafNum = 0;
    else if((bt->lchild==NULL) && (bt->rchild==NULL))
        LeafNum = 1;
    else
        LeafNum = LeafCount(bt->lchild)+LeafCount(bt->rchild);    //叶子结点数为左右子树之和
    return LeafNum;
}

int Depth(BinTree bt)
{//统计二叉树的深度
    int hl,hr,max;
    if(bt!=NULL)
    {
        hl = Depth(bt->lchild);    //求左子树的深度
        hr = Depth(bt->rchild);    //求右子树的深度
        max = hl>hr?hl:hr;
        return(max+1);    //返回树的深度
    }
    else 
        return 0;
}

void Exchange(BinTree bt)
{//交换左右二叉树
    if(bt == NULL)
        return;
    BinTNode *temp;
    temp = bt->lchild;
    bt->lchild = bt->rchild;
    bt->rchild = temp;
    Exchange(bt->lchild);
    Exchange(bt->rchild);
}

void main(int argc,char *argv[])
{
    BinTree bt;
    int xz = 1;
    int yz,sd;
    while(xz)
    {
        printf("二叉树的建立及其基本操作
");
        printf("=============================
");
        printf("1,建立二叉树的存储结构
");
        printf("2,二叉树的基本操作
");
        printf("3,交换二叉树的左右
");
        printf("0,退出系统
");
        printf("=============================
");
        printf("请选择:(0-3)
");
        scanf("%d",&xz);
        getchar();
        switch(xz)
        {//输入:ABC##DE#G##F###
        case 1:
            printf("输入二叉树的先序序列结点值:
");
            CreateBiTree(bt);
            printf("二叉树的链式存储结构已经建立完成
");
            printf("
");
            break;
        case 2:
            printf("该二叉树的先序遍历序列是:");
            PreOrderTraverse(bt);
            printf("
");    //输出ABCDEGF
            printf("该二叉树的中序遍历序列是:");
            InOrderTraverse(bt);
            printf("
");    //输出CBEGDFA
            printf("该二叉树的后序遍历序列是:");
            PosOrderTraverse(bt);
            printf("
");    //输出CGEFDBA

            printf("该二叉树的中序非递归遍历序列是;");
            InOrder(bt);
            printf("
");    //输出CBEGDFA

            printf("该二叉树的结点个数是;%d
",Size(bt));

            yz = LeafCount(bt);
            printf("该二叉树的叶子结点个数是:%d
",yz);

            sd = Depth(bt);
            printf("该二叉树的深度是:%d
",sd);
            printf("
");
            break;
        case 3:
            Exchange(bt);
            printf("该二叉树已交换左右字树:
");
            printf("
");
            break;
        case 0:
            break;
        }
    }
}

原文地址:https://www.cnblogs.com/sun-/p/5087129.html