中国大学MOOC-陈越、何钦铭-数据结构-2017秋 03-树2 List Leaves(25 point(s))

通过编号 知道
它的 位置信息,但 因为不是完全二叉树,所以并不能判断 他具体位置。
通过 左 右 编号 知道 每一个节点的 左右子树是谁。
因题目要求从上到下,从左到右,很符合层序遍历。
层序遍历的方法为:创建队列,遍历树。(前提为知道树的根节点)
因root结点不存在于任何左右子树中。故排除可得根节点。
(通过 编号总数和 - 结点左右子树编号总数和 = 根节点位置)
问题:1、不知道 节点的 父节点是谁
因题目所给信息全面,故不讨论问题1。

#include <stdio.h>
#include <stdlib.h>
struct BinTree{
    int left;
    int right;

};
typedef struct BinTree *Tree;
void addq(int queue[],int K,int *top,int *rear,int size);
int deleteq(int queue[],int *top,int *rear,int size);
int main(){
    int i,j;
    int size;
    scanf("%d",&size);
    int orderSum=0,numSum=0;
    int root;
    char left[2],right[2];
    Tree T = (Tree)malloc(size*sizeof(struct BinTree));
    for(i=0;i<size;i++){
        scanf("%s %s",&left,&right);
        if(left[0]=='-')(T+i)->left = -1;else (T+i)->left = atoi(left),numSum+= atoi(left);
        if(right[0]=='-')(T+i)->right = -1;else (T+i)->right = atoi(right),numSum+= atoi(right);
        orderSum+=i;
    }
    //构建队列
    int queue[size+1];
    int top=-1,rear=-1;
    int element;
    root = orderSum -numSum;
    addq(queue,root,&top,&rear,size);
    i=0;
    while(1){
    element = deleteq(queue,&top,&rear,size);
    if(element==-1)break;
    if((T+queue[element])->left!=-1)addq(queue,(T+queue[element])->left,&top,&rear,size);
    if((T+queue[element])->right!=-1)addq(queue,(T+queue[element])->right,&top,&rear,size);
    if((T+queue[element])->right==-1&&(T+queue[element])->left==-1){
            if(i!=0)printf(" ");
            printf("%d",queue[element]);
            i++;
    }
    }
}
void addq(int queue[],int K,int *top,int *rear,int size){
    *rear = (*rear+1)%size;
    queue[*rear] = K;
}
int deleteq(int queue[],int *top,int *rear,int size){
    if(*top==*rear)return -1;
    *top = (*top+1)%size;
    return *top;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值