二叉树的链式存储及其部分函数实现

题意

实现二叉树的链式存储和部分的函数

思路

这是一个链式存储实现的二叉树。首先 是构造了一个名为 node 的 二叉树数据结构内有(1)char 变量,(2)两个指向其本身的结构体指针变量 lch,rch.然后 用typedef分别给 node结构体起了一个Bn的别名和给 node* 起了一个Bt 的别名方便后面代码的使用。Bn和Bt分别是代表二叉树节点           类型和二叉树节点指针。在主函数里先定义了一个结构体指针(node *) 类型的变量 head,这个结构体指针变量 head是我们要构造的二叉树的根结点;(变量的本质是在内存中开辟一块空间,这块空间在内存中有相应的地址,而空间里存放我们要存放的数据。)在 cbtree函数里头 形参 是( Bt &T) 意思是定义了一个结构体指针变量 T ,而 T前面的 & 起到了一个引用传递(意思是调用函数cbtree时引用了head变量)的作用。cbtree函数内部是一个先序构造二叉树的操作,前面已说明是在head上进行操作则在调用cbtree函数的开始就是对 head 结点的操作 。输入date 数据 c如果c是' , ' 则变量T(这步操作是变量head为空,接下来的递归操作就是具体的树的左右分支结点为空)就为空,否则进行 T=new Bn(T=new Bn,申请一块该类型空间,并把地址返回,借此完成了结构体指针变量的初始化)并把 c 的值赋给T->date(这步操作是把 c 的值赋给结构体指针变量head的,接下来的递归操作就是给具体的树的左右分支结点赋值),接下来就是递归操作实现左右子树的构建。

code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef struct node
{
    char date;
    node *lch,*rch;// 在结构体中定义指针型的左子树和右子树
}Bn,*Bt;           // Bn 代表结点 *Bt代表根节点

void cbtree(Bt &T) // 先序建二叉树
{
    char c;
    scanf("%c",&c);

    if(c==',')
        T=NULL;
    else
    {
        T=new Bn;
        T->date=c;
        cbtree(T->lch);
        cbtree(T->rch);
    }
    return ;
}

void pre(Bt T)    //先序遍历二叉树
{
    if(T)
    {
        printf("%c",T->date);
        pre(T->lch);
        pre(T->rch);
    }
}

void in(Bt T)     //中序遍历二叉树
{
    if(T)
    {
        in(T->lch);
        printf("%c",T->date);
        in(T->rch);
    }
}

void post(Bt T)   //后序遍历二叉树
{
    if(T)
    {
        post(T->lch);
        post(T->rch);
        printf("%c",T->date);
    }
}

void level(Bt T)  //层次遍历二叉树
{
    queue<Bn> Q;
    Q.push(*T);
    while(!Q.empty())
    {
        Bn next=Q.front();
        Q.pop();
        printf("%c",next.date);
        if(next.lch) Q.push(*(next.lch));
        if(next.rch) Q.push(*(next.rch));
    }
}

int cnt=0;
void cntleaf1(Bt T) //求叶子节点
{
    if(T)
    {
        if(!T->lch&&!T->rch)
        {
            cnt++;
            return ;
        }
        cntleaf1(T->lch);
        cntleaf1(T->rch);
    }
}

int cntleaf2(Bt T)  //求叶子节点
{
    if(!T) return 0;
    if(!T->lch&&!T->rch) return 1;
    else
    {
        int n1=cntleaf2(T->lch);
        int nr=cntleaf2(T->rch);
        return n1+nr;
    }
}

int dep(Bt T)       //求二叉树的深度
{
    int ddep=0;
    if(!T) return ddep;
    int n1=dep(T->lch);
    int nr=dep(T->rch);
    return (n1>nr ? n1:nr)+1 ;
}

int main()
{
    Bt head;

    cbtree(head); // 先序遍历二叉树
    pre(head);
    printf("\n");

    in(head);     // 中序遍历二叉树
    printf("\n");

    post(head);   // 后序遍历二叉树
    printf("\n");

    level(head);  // 层次遍历二叉树
    printf("\n");

    cntleaf1(head); // 求二叉树的叶子节点
    printf("%d\n",cnt);
    printf("%d\n",cntleaf2(head)); // 求二叉树深度
    printf("%d\n",dep(head));
}

猜你喜欢

转载自blog.csdn.net/LaoXiangQ/article/details/83144614