紫书例题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 树的层次遍历的主要内容,如果未能解决你的问题,请参考以下文章
Uva--839 Not so Mobile(二叉树的递归遍历)