二叉树的建立和遍历

建立以二叉链作为存储结构的二叉树,实现 1)先序遍历; 2)中序遍历; 3)后序遍历; 4)编程计算二叉树的叶子结点个数。

输入描述:
按照先序遍历序列输入二叉树中数据元素的值,没有的输入0表示。
输出描述:
第一行输出先序遍历序列 第二行输出中序遍历序列 第三行输出后序遍历序列 第四行输出叶子结点的个数。
输入样例#:
A B C 0 0 0 D E 0 F 0 0 G 0 0
输出样例#:
A B C D E F G 
C B A E F D G 
C B F E G D A 
3
#include <stdio.h>
#include <stdlib.h>

typedef struct BiNode{
    char data;
    struct BiNode *lchild;
    struct BiNode *rchild;
}*Bitree;

int create(Bitree &L);
void visit(Bitree L);
void Preorder(Bitree L);  //先序遍历
void Inorder(Bitree L);  //中序遍历
void Postorder(Bitree L); //后序遍历
void find(Bitree L,int &sum);  //查找叶子结点

int main(){
    Bitree L;
    create(L);
    Preorder(L);
    printf("\n");
    Inorder(L);
    printf("\n");
    Postorder(L);
    printf("\n");
    int sum=0;
    find(L,sum);
    printf("%d",sum);
    return 0;
}

int create(Bitree &L){  //先序遍历生成树
    char e;
    scanf("%c",&e);
    getchar();
    if(e=='0') L=NULL;
    else {
        L=(Bitree )malloc(sizeof(Bitree));
        L->data=e;
        create(L->lchild);
        create(L->rchild);
    }
    return 1;
}

void visit(Bitree L){  //输出
    printf("%c ",L->data);
}

void Preorder(Bitree L)  //先序遍历
{
    if(L!=NULL)
    {
        visit(L);
        Preorder(L->lchild);
        Preorder(L->rchild);
    }
}


void Inorder(Bitree L){  //中序遍历
    if(L!=NULL)
    {
        Inorder(L->lchild);
        visit(L);
        Inorder(L->rchild);
    }
}

void Postorder(Bitree L){  //后序遍历
    if(L!=NULL){
        Postorder(L->lchild);
        Postorder(L->rchild);
        visit(L);
    }
}

void find(Bitree L,int &sum)  //查找叶子结点
{
    if(L!=NULL)
    {
        if(L->lchild==NULL&&L->rchild==NULL)
            sum++;
        find(L->lchild,sum);
        find(L->rchild,sum);
    }
}

void order(Bitree L)//二叉树层次遍历
{

    Bitree queue[7];
    int front=0,rear=0;
    queue[rear]=L;
    rear++;
    while(front!=rear)
    {
        visit(queue[front]);
        if(queue[front]->lchild!=NULL)
        {
            queue[rear]=queue[front]->lchild;
            rear++;
        }
        if(queue[front]->rchild!=NULL)
        {
            queue[rear]=queue[front]->rchild;
            rear++;
        }
        front++;
    }
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种树形结构,它的每个节点最多只有两个子节点。二叉树遍历方式有三种:先序遍历、中序遍历和后序遍历。其中,先序遍历是指先访问根节点,然后访问左子树,最后访问右子树;中序遍历是指先访问左子树,然后访问根节点,最后访问右子树;后序遍历是指先访问左子树,然后访问右子树,最后访问根节点。 二叉树建立可以通过递归或非递归方式实现。递归方式建立二叉树的过程是:先读入一个节点的值,如果该节点的值不为空,则创建一个新节点,并将该节点的值赋给新节点;然后递归调用建立左子树和右子树的过程,直到读入的节点值为空为止。非递归方式建立二叉树的过程是:使用一个栈来存储节点,先读入根节点的值,创建一个新节点,并将该节点入栈;然后读入下一个节点的值,如果该节点的值不为空,则创建一个新节点,并将该节点入栈,并将该节点作为上一个节点的左子节点;如果该节点的值为空,则弹出栈顶节点,并将该节点作为上一个节点的右子节点。 二叉树遍历算法可以通过递归或非递归方式实现。递归方式实现二叉树遍历算法比较简单,只需要按照遍历顺序递归访问左子树和右子树即可。非递归方式实现二叉树遍历算法需要使用栈来存储节点。先序遍历的非递归算法是:先将根节点入栈,然后弹出栈顶节点并访问该节点,将该节点的右子节点入栈,再将该节点的左子节点入栈,重复上述过程直到栈为空;中序遍历的非递归算法是:先将根节点入栈,然后将根节点的所有左子节点入栈,重复弹出栈顶节点并访问该节点,将该节点的右子节点入栈,重复上述过程直到栈为空;后序遍历的非递归算法是:先将根节点入栈,然后将根节点的所有左子节点入栈,重复弹出栈顶节点并访问该节点,如果该节点的右子节点不为空且未被访问过,则将该节点的右子节点入栈,否则访问该节点,重复上述过程直到栈为空。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值