原文链接:https://www.dreamwings.cn/ytu3022/2595.html

3022: 完全二叉树(1)

时间限制: 1
Sec  内存限制: 128
MB

提交: 26  解决: 7

题目描述

一棵具有n个节点的完全二叉树以顺序方式存储在数组A中,设计一个算法构造该二叉树的链存储结构。

即编写一个函数,将二叉树数组存储形式转移到*Tree中。

其中二叉树的节点定义为

typedef struct Node
{
    ElemType data;
    Node* lchild;
    Node* rchild;
} TBNode;
 
编写一个函数
void solve(TBNode *&Tree,char *c,int pos);  完成相应操作。
// Tree为二叉树根节点,c为二叉树数组的形式表示,main()中传入的pos=1

输入

输入只有一行,为二叉树的数组表示形式。

输出

输出只有一行,为二叉树链存储结构的层序遍历.

样例输入

ABCD#EF#G##H##I

样例输出

ABCDEFGHI
思想:根据二叉树以数组表示形式的定义,每一个节点的孩子节点所在位置是它本身位置的二倍与二倍加一,就这样。

比如a[0]的位置是1,它的孩子节点是a[1*2-1]与a[1*2]   //减一是因为逻辑位序和物理位序差1

然后利用递归的思想,便可以建立起整个二叉树的链状结构了!

算法部分:
void solve(TBNode *&Tree,char *c,int pos)
{
    if(c[pos-1]=='#'||pos>(int)strlen(c))   //递归出口为该节点为NULL
    {
        Tree=NULL;
        return;
    }
    Tree=(TBNode*)malloc(sizeof(Node));     //开辟空间
    Tree->data=c[pos-1];
    solve(Tree->lchild,c,pos*2);            //递归左孩子
    solve(Tree->rchild,c,pos*2+1);          //递归右孩子
}


完整代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
typedef char ElemType;
#define SizeMax 205
typedef struct Node
{
    ElemType data;
    Node* lchild;
    Node* rchild;
} TBNode;
void solve(TBNode *&Tree,char *c,int pos)
{
    if(c[pos-1]=='#'||pos>(int)strlen(c))   //递归出口为该节点为NULL
    {
        Tree=NULL;
        return;
    }
    Tree=(TBNode*)malloc(sizeof(Node));     //开辟空间
    Tree->data=c[pos-1];
    solve(Tree->lchild,c,pos*2);            //递归左孩子
    solve(Tree->rchild,c,pos*2+1);          //递归右孩子
}
void Print(TBNode *Tree)
{
    TBNode *p;
    TBNode *qu[SizeMax];
    int front,rear;
    front=rear=-1;
    rear++;
    qu[rear]=Tree;
    if(Tree==NULL)return;
    while(front!=rear)
    {
        front=(front+1%SizeMax);
        p=qu[front];
        printf("%c",p->data);
        if(p->lchild!=NULL)
        {
            rear=(rear+1)%SizeMax;
            qu[rear]=p->lchild;
        }
        if(p->rchild!=NULL)
        {
            rear=(rear+1)%SizeMax;
            qu[rear]=p->rchild;
        }
    }
}
int main()
{
    char c[205];
    TBNode *Tree;
    gets(c);
    solve(Tree,c,1);
    Print(Tree);
    return 0;
}

YTU 3022: 完全二叉树(1)的更多相关文章

  1. [LeetCode] Count Complete Tree Nodes 求完全二叉树的节点个数

    Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...

  2. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)

    1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 136[Submit][Status ...

  3. ytu 1058: 三角形面积(带参的宏 练习)

    1058: 三角形面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 190  Solved: 128[Submit][Status][Web Boar ...

  4. ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)

     小鼠迷宫问题 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1  Solved: 1 [Submit][Status][Web Board] Desc ...

  5. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  6. [nowCoder] 完全二叉树结点数

    给定一棵完全二叉树的头节点head,返回这棵树的节点个数.如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法. 分析:遍历的话不管是前序.中序.后序还是层次都是O(N),低于O(N)只能是 ...

  7. 完全二叉树的高度为什么是对lgN向下取整

    完全二叉树的高度为什么是对lgN向下取整呢? 说明一下这里的高度:只有根节点的树高度是0. 设一棵完全二叉树节点个数为N,高度为h.所以总节点个数N满足以下不等式: 1 + 21 + 22 +……+ ...

  8. [itint5]完全二叉树节点个数的统计

    http://www.itint5.com/oj/#4 这题是利用完全二叉树的性质计算节点数目.那么是通过比较左右子树的最左结点的高度来看那边是满的,然后递归计算. //使用getLeftChildN ...

  9. [九度OJ]1113.二叉树(求完全二叉树任意结点所在子树的结点数)

    原题链接:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...

随机推荐

  1. Emacs 列编辑

    copy from http://chandlewei.blogbus.com/logs/15583440.html 不敢独享,与大家分享.也可以在Emacs中用C-x C-h列出全部命令,查找C-x ...

  2. PAT 解题报告 1047. Student List for Course (25)

    1047. Student List for Course (25) Zhejiang University has 40000 students and provides 2500 courses. ...

  3. 使用Universal USB Installer安装Ubuntu

    1.下载Universal USB Installer 下载地址: 2.下载ubuntu 14 desktop.iso 运行Universal USB Installer,找到电脑上 ubuntu 1 ...

  4. SQL 数据库备、还,附、分,数据查询,聚合函数

    认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点. 数据库备 ...

  5. JS小练习 留言功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Android深入浅出之Binder机制

    一说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行 ...

  7. springday03-go1

    springday02项目下新建包annotation11.复制xml文件到包annotation1下,并添加组件扫描方式代码2.Waiter类实现序列化接口,构造函数,并使用特定注解标记waiter ...

  8. mysql bin log日志

    装mysql,运行一段时间后,在mysql目录下出现一堆类似mysql-bin.000***,从mysql-bin.000001开始一直排列下来,而且占用了大量硬盘空间,高达几十个G. 对于这些超大空 ...

  9. 部署ganglia3.7

    环境 centOS6.6 gmetad节点关闭iptable gmetad和httpd只需要在一台节点安装,gmond需要在每台节点上安装. 一.安装epel源 sudo wget http://do ...

  10. paper 82:边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny)

    不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界 ...