zoukankan      html  css  js  c++  java
  • 数据结构实验之二叉树的建立与遍历

    
    

    数据结构实验之二叉树的建立与遍历

    添加一下各个遍历的输出便于理解

    顺序树abd,,e,,cf,,g,,
    先序遍历打印:abdecfg
    中序遍历打印:dbeafcg
    后序遍历打印:dbefcga

    
    

    Time Limit: 1000MS Memory limit: 65536K

    
    

    题目描述

    
    
           已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。
    
    

    输入

    
    
     输入一个长度小于50个字符的字符串。
    
    

    输出

    
    
    输出共有4行:
    第1行输出中序遍历序列;
    第2行输出后序遍历序列;
    第3行输出叶子节点个数;
    第4行输出二叉树深度。
    
    

    示例输入

    
    
    abc,,de,g,,f,,,
    
    

    示例输出

    
    
    cbegdfa
    cgefdba
    3
    5
     
     
     
    /*前序遍历中序遍历什么的都是一个道理,只是输出的时候的顺序不同,都是先访问左孩子或者右孩子后在访问另一边*/
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node
    {
    int data;
    struct node *l;
    struct node *r;
    }Tree;
    int count = 0;

    Tree *creat(Tree *p)
    {
    char c;

    if((c = getchar()) == ',')
    p = NULL;
    else
    {
    p = (Tree*)malloc(sizeof(Tree));
    p->data = c;
    p->l = creat(p->l);
    p->r = creat(p->r);
    }
    return p;

    }

    void pretravel(Tree *p)
    {
    if(p != NULL)
    {
    printf("%c",p->data);/*先把所有的最左边的左孩子打出来,然后从下往上走打印最下面的右孩子,然后倒数第二层的右孩子,然后打印倒数第二层的右孩子的左孩子,在打印右孩子然后倒数第三层的右孩子*/
    pretravel(p->l);
    pretravel(p->r);
    }
    }

    void intravel(Tree *p)
    {
    if(p != NULL)
    {
    intravel(p->l);
    printf("%c",p->data);/*先打印底层的左孩子,然后最底层最左边的右孩子,于先序不同的就是先序的左孩子从根开始打,而中序从底层开始*/
    intravel(p->r);
    }
    }

    void lasttravel(Tree *p)/*先打印最底层的*/
    {
    if(p != NULL)
    {
    intravel(p->l);
    intravel(p->r);
    printf("%c",p->data);
    }
    }


    void leaves(Tree *p)
    {
    if(p!=NULL)
    {
    if(p->l==NULL&&p->r==NULL)
    {
    count++;
    }
    leaves(p->l);
    leaves(p->r);
    }
    }

    int treedeep(Tree *p)
    {
    int ld,rd;
    if(!p)
    return 0;
    else
    {
    ld = treedeep(p->l);
    rd = treedeep(p->r);
    if(ld>rd)
    return ld+1;
    else
    return rd+1;
    }
    }
    int main()
    {
    Tree *p;
    int n;
    p = creat(p);
    intravel(p);
    printf("\n");
    lasttravel(p);
    printf("\n");
    leaves(p);
    printf("%d\n",count);
    n = treedeep(p);
    printf("%d\n",n);
    return 0;
    }
  • 相关阅读:
    css 解决fixed 布局下不能滚动的问题
    js 正则常用函数 会正则得永生
    巧用call,appl有 根据对象某一属性求最大值
    锚点 , angular 锚点 vue锚点
    css 改变浏览器滚动条的样式
    angular 常用插件集合
    angular4,angular6 父组件异步获取数据传值子组件 undefined 问题
    angular组件之间的通讯
    tomcat的配置详解:[1]tomcat绑定域名
    click 绑定(三)防止事件冒泡
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2368498.html
Copyright © 2011-2022 走看看