用二叉链表存储的二叉树进行先序、中序和后序遍历的算法

本文介绍了一种使用二叉树链表存储结构的方法,并演示了如何通过递归方式完成二叉树的创建、先序、中序、后序遍历等操作。此外,还提供了求解二叉树深度及叶子节点数量的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作

#include<iostream>  
#include<cstdio>  
#include<stdlib.h>  
using namespace std;  
typedef int Elemtype;  
typedef struct BiTnode  
{  
        Elemtype data;//数据域  
        struct BiTnode* Lchild,*Rchild; //左右子树域;  
}BiTnode,*BiTree;  
  
int create(BiTree *T)  
{  
        Elemtype ch;  
        Elemtype temp;  
        scanf("%d",&ch);  
        temp=getchar();  
        if(ch==-1)  
        {  
                *T=NULL;  
        }  
        else  
        {  
                *T=(BiTree)malloc(sizeof(BiTnode) );  
                if(!(*T))  
                {  
                    exit(-1);  
                }  
                else  
                {  
                        (*T)->data=ch;  
                        printf("请输入%d的左节点的值",ch);  
                        create(&(*T)->Lchild);  
                        printf("请输入%d的右节点的值",ch);  
                        create(&(*T)->Rchild);  
                }  
  
        }  
        return 1;  
  
}  
  
void Traverse(BiTree T)//前序遍历二叉树  
{  
        if(NULL==T)  
        {  
                return;  
        }  
        else  
        {  
            printf("%d ",T->data);  
            Traverse(T->Lchild);  
            Traverse(T->Rchild);  
        }  
  
}  
  
//中序遍历二叉树  
void midTraverse(BiTree T)  
{  
        if(T==NULL){return;}  
        midTraverse(T->Lchild);  
        printf("%d ",T->data);  
        midTraverse(T->Rchild);  
}  
  
//后序遍历二叉树  
void lasTraverse(BiTree T)  
{  
        if(T==NULL){return;}  
        lasTraverse(T->Lchild);  
        lasTraverse(T->Rchild);  
        printf("%d ",T->data);  
  
}  
  
//求二叉树的深度  
int TreeDeep(BiTree T)  
{  
        int deep=0;  
        if(T)  
        {  
                int leftdeep=TreeDeep(T->Lchild);  
                int rightdeep=TreeDeep(T->Rchild);  
                deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;  
  
        }  
        return deep;  
  
}  
  
//求二叉树叶子节点个数  
int Leafcount(BiTree T,int &num)  
{  
        if(T)  
        {  
                if(T->Lchild==NULL&&T->Rchild==NULL)  
                {  
                        num++;  
                }  
                Leafcount(T->Lchild,num);  
                Leafcount(T->Rchild,num);  
        }  
        return num;  
}  
  
  
  
int main()  
{  
     BiTree T;  
     BiTree *p=(BiTree*)malloc(sizeof(BiTree));  
     int deepth=0,num=0;  
     printf("请输入第一个节点的值,-1代表没有叶节点:\n");  
     create(&T);  
     printf("先序遍历二叉树:\n");  
     Traverse(T);  
     printf("\n");  
     printf("中序遍历二叉树:\n");  
     midTraverse(T);  
     printf("\n");  
     printf("后序遍历二叉树:\n");  
     lasTraverse(T);  
     printf("\n");  
     deepth=TreeDeep(T);  
     printf("树的深度:%d\n",deepth);  
     printf("\n");  
     Leafcount(T,num);  
     printf("二叉树的叶子节点个数为:%d\n",num);  
     printf("\n");  
     return 0;  
}


  
  
 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值