紫书例题6-7 树的层次遍历

纯小白也能看懂的代码,一起努力

6.3.2 二叉树的层次遍历

例题6-7 树的层次遍历(Trees on the level, Duke 1993, UVa 122)

输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号“()”结束(这对括号本身不代表一个结点),如图6-3所示

注意,如果从根到某个叶结点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出-1。结点个数不超过256。

样例输入:

(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()

(3,L) (4,R) ()

样例输出:

5 4 8 11 13 4 7 2 1

-1

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<vector>
  4 #include<queue>
  5 using namespace std;
  6 const int maxn = 256;
  7 char s[maxn];       //保存读入节点
  8 bool failed;
  9 
 10 struct Node
 11 {
 12     bool have_value;
 13     int v;          //节点值
 14     Node *left, *right;
 15     Node():have_value(false), left(NULL),right(NULL){}
 16 };
 17 Node* root;         //二叉树根节点
 18 Node* newnode()     //创建新节点
 19 {
 20     return new Node;
 21 }
 22 
 23 void addnode(int v, char* s)    //v为节点值,字符串s为LR加一个右括号)
 24 {
 25     int n = strlen(s);      //求传到函数里字符串的长度
 26     Node* u = root;         //根节点地址赋值给u
 27     for(int i = 0; i <n; i++)       
 28         if(s[i] == 'L')
 29         {
 30             if(u ->left == NULL)
 31             u ->left = newnode();
 32             u = u ->left;
 33         }
 34         else if(s[i] == 'R')
 35         {
 36             if(u ->right == NULL)
 37             u ->right = newnode();
 38             u = u ->right;
 39         }
 40         if(u ->have_value)
 41             failed = true;
 42         u ->v = v;
 43         u ->have_value = true;
 44 }
 45 
 46 bool read_input()
 47 {
 48     failed = false;
 49     root = newnode();
 50     for(;;)
 51     {
 52         if(scanf("%s", s) != 1)
 53             return false;
 54         if(!strcmp(s, "()"))
 55             break;
 56         int v;
 57         sscanf(&s[1], "%d", &v);        //从字符串中读入%d格式的内容存入v
 58         addnode(v, strchr(s, ',')+1);   //strchr(s, ',')是找到逗号的地址,+1是LR
 59     }
 60     return true;
 61 }
 62 
 63 bool bfs(vector<int>& ans)
 64 {
 65     queue<Node*> q;
 66     ans.clear();
 67     q.push(root);
 68     while(!q.empty())
 69     {
 70         Node* u = q.front();
 71         q.pop();
 72         if(!u->have_value)
 73             return false;
 74         ans.push_back(u ->v);
 75         if(u ->left != NULL)
 76         q.push(u ->left);
 77         if(u ->right != NULL)
 78             q.push(u ->right);
 79     }
 80     return true;
 81 }
 82 
 83 void remove_true(Node* u)       //防止内存泄漏
 84 {
 85     if(u == NULL)
 86         return;
 87     remove_true(u ->left);
 88     remove_true(u ->right);
 89     delete u;
 90 }
 91 
 92 int main()
 93 {
 94     read_input();
 95     vector<int>ans;
 96     bfs(ans);
 97     if(ans.empty())
 98         printf("-1\n");
 99     else
100     {
101         for(int i = 0; i < ans.size(); i++)
102             printf("%d\n", ans[i]);
103     }
104     printf("\n");
105     remove_true(root);
106     return 0;
107 }

 

转载于:https://www.cnblogs.com/riven7/p/10512449.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值