慕课浙大数据结构-03-树2 List Leaves (25分)

代码照着这篇文章写的
《数据结构》03-树2 List Leaves
解题思路:对树进行层序遍历就可以了
1.flag变量的使用,自己写不出来。

        if(t.Left==Null&&t.Right==Null){
            if(flag){
                cout<<" ";
            }
            else{
                flag = true;        
            }
            cout<<t.Data;
        }

2.最开始没写结构体TreeNode中的Data,导致不知道该输出什么数据。
3.using namespace std;//如果写会报错‘cout’ was not declared in this scope
4.pop没有返回值,我错以为返回的是弹出的元素。

#include<iostream>
#include<queue>
#define Null -1
#define MAXSIZE 10 //不需要加分号
using namespace std;//如果写会报错‘cout’ was not declared in this scope
typedef int Tree;
struct TreeNode{
    int Data;  //使用这个Data来存放结构数组T内每个节点存储的位置,便于输出结果
    Tree Left;
    Tree Right;
}T[MAXSIZE];
Tree BuildTree(struct TreeNode T[]);
void Traversal(int root);
Tree BuildTree(struct TreeNode T[]){
    int Root=Null,N; //刚开始将节点置为空,若为空树的时候可返回Null
    char cl,cr;
    scanf("%d",&N);
    if(N){   //加入对树为空的判断
    int check[MAXSIZE]={0};//置为零
        for(int i=0;i<N;++i){   //把N个节点读入树
            //C语言输入:scanf("\n%c %c",&cl,&cr);//&T[i].Data,&cl,&cr是不是不需要&  蒙
            //C++输入见下一行,似乎更简单了
            cin>>cl>>cr;
            T[i].Data = i;
            if(cl!='-'){  //将单引号错写为双引号会报错comparison between pointer and integer
                T[i].Left = cl - '0';
                check[T[i].Left] = 1;
            }
            else{
                T[i].Left = Null;
            }
            if(cr!='-'){
                T[i].Right = cr - '0';
                check[T[i].Right] = 1;
            }
            else{
                T[i].Right = Null;
            }

        }
        int i;
        for(i=0;i<N;++i){
            if(!check[i]) break;        
        }
        Root = i; 
    }
    return Root;    
}
void Traversal(int root){
    if(root==Null) {
        cout<<"-";
        return;  //结束函数下运行
    }
    bool flag = false;
    struct TreeNode t;
    queue<struct TreeNode> q;
    q.push(T[root]);
    while(!q.empty()){
        t = q.front();
        q.pop();  //队列中的pop没有返回值么
        if(t.Left==Null&&t.Right==Null){
            if(flag){
                cout<<" ";
            }
            else{
                flag = true;        
            }
            cout<<t.Data;
        }
        //以下两个if 我没十分搞清楚应该放在循环里还是外面,如果放在里面第一次循环pop出根节点之后队列为空,不再循环了
        if(t.Left!=Null){   
            q.push(T[t.Left]);
        }
        if(t.Right!=Null){
            q.push(T[t.Right]);
        }
    }

}

int main(){
    int r;
    r = BuildTree(T);
    Traversal(r);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值