• C语言实现对二叉树的操作


    C语言实现对二叉树的操作

    代码思想:

    (1)生成二叉树:采用先序遍历的方式创建二叉树;
    (2)先序遍历:首先访问根节点,然后按照先序遍历的方式访问左子树,再按照先序遍历的方式访问右子树。
    (3)中序遍历:首先按照中序遍历方式访问左子树,然后访问根节点,再按照中序遍历访问右子树;
    (4)后序遍历:首先按照后序遍历的方式访问左子树,再按照后序遍历的方式访问右子树,最后访问根节点;
    (5)计算二叉树深度:通过遍历二叉树的左子树和右子树深度,然后比较左子书和右子树的大小,返回大的深度;
    (6)计算叶子节点个数:通过先序遍历二叉树,当子节点为0时,叶子结点数加1;

    代码实现的功能:

    1.先序遍历 2.中序遍历 3.后序遍历 4.计算叶子节点个数 5.计算二叉树深度

    代码内容:

    #include "stdio.h"
    #include "malloc.h"
    #include "stdlib.h"
    typedef struct BTNode
    {
        int data;
        struct BTNode *Lchild,*Rchild;
    }BTree;
    //初始化
    BTree * Ini_BTNode()
    {
        BTree *bt ;
        int a;
        bt=(BTree *)malloc(sizeof(BTree));
        printf("输入根节点:(0表示空树)
    ");
        scanf("%d",&a);
        if(a==0)
        {
            printf("这是空树!");
            exit(0);
        }
        bt->data=a;
        bt->Lchild=NULL;  //左子树节点
        bt->Rchild=NULL;  //右子树节点
        return bt;
    }
    int creat_BiTree(BTree *bt)//输入左子树
    {
    
          int a;
          BTree *Node;
          printf("请输入%d节点的左孩子(0为空)
    ",bt->data) ;
          scanf("%d",&a);
          if(a!=0)
          {
                  Node=(BTree*)malloc(sizeof(BTree));
                  Node->data=a;
                  Node->Lchild=NULL;
                  Node->Rchild=NULL;
                  bt->Lchild=Node;
                  creat_BiTree(bt->Lchild);
    
          }
          printf("请输入%d节点的右孩子(0为空)
    ",bt->data) ; //输入右子树
          scanf("%d",&a);
          if(a!=0)
          {
                  Node=(BTree *)malloc(sizeof(BTree));
                  Node->data=a;
                  Node->Lchild=NULL;
                  Node->Rchild=NULL;
                  bt->Rchild =Node;
                  creat_BiTree(bt->Rchild);
    
          }
    
          return 0;
    
    
    }
    void PerOrderTraverse(BTree *bt) //先序遍历
    {
        if(bt!=NULL)
       {
            printf("%d -->",bt->data);
            PerOrderTraverse(bt->Lchild);
            PerOrderTraverse(bt->Rchild);
       }
    }
    void InOrderTraverse(BTree *bt) //中序遍历
    {
        if(bt!=NULL)
       {
            InOrderTraverse(bt->Lchild);
            printf("%d -->",bt->data);
            InOrderTraverse(bt->Rchild);
       }
    }
    void PostOrderTraverse(BTree *bt) //后序遍历
    {
        if(bt!=NULL)
       {
            PostOrderTraverse(bt->Lchild);
            PostOrderTraverse(bt->Rchild);
            printf("%d -->",bt->data);
       }
    }
    
    int LeafCount(BTree *bt)
    {
        static int count;
        if (bt != NULL)
        {
            if (bt->Lchild == NULL && bt->Rchild == NULL)
            {
                count++;
            }
    
            LeafCount(bt->Lchild);
            LeafCount(bt->Rchild);
        }
    
        return count;
    }
    
    int TreeDeep(BTree *bt)
    {
        int deep = 0;
        if (bt != NULL)
        {
            int leftdeep = TreeDeep(bt->Lchild);
            int rightdeep = TreeDeep(bt->Rchild);
            deep = leftdeep >= rightdeep?leftdeep+1:rightdeep+1;
        }
    
        return deep;
    }
    
    main()
    {
        BTree  *bt;
        int a,leafCount,depth;
        printf("		****************  二叉树操作  ****************
    
    ");
        bt=Ini_BTNode();creat_BiTree(bt);
        printf("以%d为根的树创建成功!
    ",bt->data);
        while(1)
        {
    
            printf("1. 先序遍历
    ");
            printf("2. 中序遍历
    ");
            printf("3. 后序遍历
    ");
            printf("4.计算叶子节点个数
    ");
            printf("5.计算二叉树深度
    ");
            printf("6. 退出程序
    ");
    
            printf("请选择:");
            scanf("%d",&a);
            switch(a)
            {
             case 1:
                    printf("先序遍历
    ");
                    PerOrderTraverse(bt);
                    printf("
    ");
                    break;
             case 2:
                     printf("中序遍历
    ");
                     InOrderTraverse(bt);
                     printf("
    ");
                     break;
    
    
             case 3:
                     printf("后序遍历
    ");
                     PostOrderTraverse(bt);
                     printf("
    ");
                     break;
             case 4:
    
                    leafCount = LeafCount(bt);
                    printf("叶子节点个数:%d
    ",leafCount);
                    printf("
    ");
                    break;
             case 5:
                    depth = TreeDeep(bt);
                    printf("树的深度为:%d
    ",depth);
                    printf("
    ");
                    break;
             case 6:
                     exit(0);
    
             default:
                     printf("输入错误");
            }
    
         }
    
    }
    
    博客园:https://www.cnblogs.com/newtol 微信公众号:Newtol 【转发请务必保留原作者,否则保留追责权利】
  • 相关阅读:
    CefSharp应用——High DPI问题
    CefSharp应用——程序输出
    CefSharp应用——环境搭建
    QTTabBar加载项被禁用
    OCR 中文汉字识别,可用于文档识别,身份证识别,名片识别,采用字库+卷积神经网络
    springboot中Thymeleaf和Freemarker模板引擎的区别
    一种mysql 实现用户前两条语句方案
    Elasticsearch java.lang.ClassNotFoundException: org.elasticsearch.common.transport.InetSocketTransportAddress
    版本6.2.4的elasticsearch包里面没有InetSocketTransportAddress
    ES spring数据JPA&spring data elasticsearch;找不到类型的属性索引
  • 原文地址:https://www.cnblogs.com/newtol/p/10159126.html
Copyright © 2020-2023  润新知