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

Posted riven7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了紫书例题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
");
 99     else
100     {
101         for(int i = 0; i < ans.size(); i++)
102             printf("%d
", ans[i]);
103     }
104     printf("
");
105     remove_true(root);
106     return 0;
107 }

 

以上是关于紫书例题6-7 树的层次遍历的主要内容,如果未能解决你的问题,请参考以下文章

6-7 树的层次遍历 uva122

uva122 二叉树的实现和层次遍历(bfs)

Uva--839 Not so Mobile(二叉树的递归遍历)

二叉树层序遍历,Trees on the level UVA - 122——紫书第六章例题和字符串新解

算法竞赛入门经典 数组实现树的层序遍历的一个小错误

基础扫盲:二叉树系列 第二讲(层次遍历与BFS)