栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 ,数据结构--二叉树,初步解释与实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 ,数据结构--二叉树,初步解释与实现

二叉树:可以非常形象的理解为一颗只有两个树枝的树。

              转化为图形解释,就是一个圆圈只有两个两个圆圈和自身有关系,并且有直线和其链接。

              转化为代码实现就是,一个节点,只携带两个指针,这两个指针分别指向一个节点。

(一).【存储结构描述】

//构造二叉树结点
typedef struct node
{
    DataType data;
    struct  node *lchild,*rchild;
}BiTNode,*BiTree;

(二).【基本操作】

1.建立二叉链表

//完全二叉树的层次顺序依次输入结点信息建立二叉链表
BiTree CreateBinTree(BiTree &bt,char *t){
    BiTree Q[MAXSIZE],s;
    int front=1,rear=0,i=0;
    char ch;//接受输入
    ch=t[i];
    i++;
    bt=NULL;
    while (ch!='#')
    {
        s=NULL;
        if (ch!='@')
        {
           s=(BiTree)malloc(sizeof(BiTNode));
           s->data=ch;
           s->lchild=s->rchild=NULL;
        }
        rear++;
        Q[rear]=s;
        if(rear==1)
            bt=s;
        else{
            if (s&&Q[front])
                  if (rear%2==0)
                      Q[front]->lchild=s;
                  else
                      Q[front]->rchild=s;
                if(rear%2==1)
                  front++;
             } 
        ch=t[i];i++;
    }
    return bt;
}

2.前序遍历(根,左,右)

//使用递归算法对二叉树进行前序遍历(根 左 右)
void PreOrderTraverse(BiTree T){
    if (T)
    {
        printf("%ct",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

3.中序遍历(左,根,右)

//使用递归算法对二叉树进行 中序遍历(左 根 右)
void  InOerderTraverse(BiTree T){
    if (T)
    {
        InOerderTraverse(T->lchild);
        printf("%ct",T->data);
        InOerderTraverse(T->rchild);
    }
}

4.后序遍历(左,右,根)

//使用递归算法对二叉树进行 后序遍历 (左 右 根)
void  PostOrderTraverse(BiTree T){
    if(T){
         PostOrderTraverse(T->lchild);
         PostOrderTraverse(T->rchild);
         printf("%ct",T->data);
    }
}

5.统计二叉树中叶子节点的个数

//统计二叉树中叶子结点的个数
int LeafNodeCount(BiTree T){
    if(!T)  return 0;
    else if(!T->lchild&&!T->rchild)  return 1;
    else return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);
}

6.统计二叉树中度为 1 的节点

//统计二叉树中度为 1 的节点
int CountNode1(BiTree T){
    if(!T||(!T->lchild&&!T->rchild))   return 0;
    else if(T->lchild&&T->rchild)  return CountNode1(T->lchild)+CountNode1(T->rchild);
   else return CountNode1(T->lchild)+CountNode1(T->rchild)+1;
}

7.统计二叉树中度 为 2 的节点

//统计二叉树中度为 2 的节点
 int  CountNode2(BiTree T){
     if(!T||(!T->lchild&&!T->rchild))  return 0;
     else if(T->lchild&&T->rchild)  return CountNode2(T->lchild)+CountNode2(T->rchild)+1;
     else return CountNode2(T->lchild)+CountNode2(T->rchild);
 }

8.主函数调用 与实现

int main(){
    BiTree B;
    char s3[13]={'H','A','B','C','J','D','@','@','E','@','@','F','#'};
    printf("n按完全二叉树的层次顺序依次输入结点信息建立二叉链表(HABCJD@@@@EF#)n");
    B=CreateBinTree(B,s3);
    printf("n使用递归算法分别进行前、中、后序遍历n");
    PreOrderTraverse(B);printf("n");
    InOerderTraverse(B);printf("n");
    PostOrderTraverse(B);printf("n");
    printf("二叉树中的叶子节点的个数:%dn",LeafNodeCount(B));
    printf("二叉树中的度为1的节点的个数:%dn",CountNode1(B));
    printf("二叉树中的度为2的节点的个数:%dn",CountNode2(B));
}

10.结果实现

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005154.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号