-
列出叶结点
2020-08-16 21:40:597-1 列出叶结点 (25分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每...7-1 列出叶结点 (25分)
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8
1 -0 -
2 75 -
4 6输出样例:
4 1 5
思路
创建树的组成(数值,左支,右支),录入每个节点的左右编号(因为有‘-’,所以要以char为中介),逐个判断左右是否为‘-’,是则令其为-1(编号之外的数,避免影响判断),不是就赋值并为其左右标号,没有被赋值的节点为根(因为他没有作为孩子出现过)。
找到根之后,从根到其左右子树寻找左右皆为-1的节点(没有孩子,是叶节点)。找的时候可以从根开始放进队列里,存在孩子就放进去,判断完了就移出,当队列为空代表判断结束。C++代码
#include<stdio.h> #include<iostream> #include<stdlib.h> #include <string> using namespace std; struct node{ int l,r,num; }; struct node tree[10]; void print(struct node no); int f[10]={0}; int main(){ int N; cin>>N; char a,b; for(int i=0;i<N;i++){ cin>>a>>b; } for(int i=0;i<N;i++){ tree[i].num=i; if(a!='-'){ tree[i].l=a-'0'; f[i]=1; }else { tree[i].l=-1; } if(b!='-'){ tree[i].r=b-'0'; f[i]=1; }else { tree[i].r=-1; } } int root; for(int i=0;i<N;i++){ if(f[i]==0){ root=i; break; } } print(tree[root]); } void print(struct node no){ int flag=1; int len=0; while(flag){ struct node N=no; if(no.l==-1&&no.r==-1){ len++; if(len==1) cout<<no.num; else cout<<" "<<no.num; } } if(no.l!=-1){ print(tree[no.l]); } if(no.r!=-1){ print(tree[no.r]); } }
-
-
PAT 列出叶结点
2018-05-12 10:22:54列出叶结点对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。输入格式:首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一...列出叶结点
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8 1 - - - 0 - 2 7 - - - - 5 - 4 6
输出样例:
4 1 5
先找出根结点,然后再层次遍历找叶子即可,AC代码如下:
#include<iostream> #include<string.h> #define MAX 15 using namespace std; typedef struct BiTNode { int lchild; int rchild; }BiTNode; BiTNode p[MAX]; int n,root,arr[MAX]; int build() { char a,b; cin >> n; getchar(); for(int i = 0;i < n; i++) { cin >> a >> b; if(a != '-') { p[i].lchild = a - '0'; arr[p[i].lchild]++; } else p[i].lchild = -1; if(b != '-') { p[i].rchild = b - '0'; arr[p[i].rchild]++; } else p[i].rchild = -1; } for(int i = 0;i < n; i++) if(!arr[i]) return i; } void level() { int fx,head = 0,tail = 0,flag = 0,que[MAX]; memset(que,0,sizeof(que)); que[tail++] = root; while(head < tail) { fx = que[head]; if(p[fx].lchild == -1 && p[fx].rchild == -1) { !flag ? cout << fx : cout <<" "<< fx; flag++; } else if(p[fx].lchild != -1 && p[fx].rchild != -1) { que[tail++] = p[fx].lchild; que[tail++] = p[fx].rchild; } else if(p[fx].lchild == -1) que[tail++] = p[fx].rchild; else que[tail++] = p[fx].lchild; head++; } } int main() { root = build(); level(); return 0; }
-
拼题A 列出叶结点
2020-04-09 15:45:22拼题A 列出叶结点 题目描述 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行...拼题A 列出叶结点
题目描述
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:8 1 - - - 0 - 2 7 - - - - 5 - 4 6
输出样例:
4 1 5沙雕的我直接用链表把题目给的树还原出来然后查找叶结点了。。。。
后来发现,emmm,,,不用这么麻烦(好像两种方法也差不多hhh)
两个版本都AC了~~
上代码:
版本一:链表还原版#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <queue> using namespace std; typedef struct Tree * TreeLink; struct Tree { int data; TreeLink left_tree, right_tree; }; int n; int ans[12]; bool is_root[12]; queue<TreeLink> q; int main() { memset(is_root, true, sizeof(is_root)); cin >> n; char l, r; TreeLink *T; T = (TreeLink *)malloc(sizeof(TreeLink) * 11); for (int i = 0; i < n; i++) // 记得为每个结点分配内存空间 T[i] = (TreeLink)malloc(sizeof(struct Tree)); TreeLink root; root = (TreeLink)malloc(sizeof(struct Tree)); for (int i = 0; i < n; i++) { getchar(); cin >> l >> r; T[i]->data = i; if (l == '-') T[i]->left_tree = NULL; if (r == '-') T[i]->right_tree = NULL; if (l != '-') { int ll = l - '0'; is_root[ll] = false; T[i]->left_tree = T[ll]; } if (r != '-') { int rr = r - '0'; is_root[rr] = false; T[i]->right_tree = T[rr]; } } // 找根节点 int R; for (int i = 0; i < n; i++) { if (is_root[i]) { R = i; break; } } int sum = 0; if (n > 0) { root = T[R]; q.push(root); while (!q.empty()) { TreeLink temp; temp = q.front(); q.pop(); if (temp->left_tree == NULL && temp->right_tree == NULL) ans[sum++] = temp->data; if (temp->left_tree != NULL) q.push(temp->left_tree); if (temp->right_tree != NULL) q.push(temp->right_tree); } } for (int i = 0; i < sum; i++) printf("%d%c", ans[i], i == sum - 1 ? '\n' : ' '); return 0; }
版本二:简练版
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; struct Tree { int data; int left_tree, right_tree; }; int n; static int flag = 0; void print(int n) { if(flag) printf(" %d", n); else { printf("%d", n); flag = 1; } } Tree T[12]; bool is_root[12]; queue<Tree> q; int main() { memset(is_root, true, sizeof(is_root)); scanf("%d", &n); char l, r; for( int i = 0; i < n; i ++ ) { getchar(); scanf("%c %c", &l, &r); T[i].data = i; if(l == '-') T[i].left_tree = -1; if(r == '-') T[i].right_tree = -1; if(l != '-') { int ll = l - '0'; T[i].left_tree = ll; is_root[ll] = false; } if(r != '-') { int rr = r - '0'; T[i].right_tree = rr; is_root[rr] = false; } } // 找根节点 int root; for( int i = 0; i < n; i ++ ) { if(is_root[i]) { root = i; break; } } if( n > 0 ) { q.push(T[root]); while(!q.empty()) { Tree t = q.front(); q.pop(); if(t.left_tree == -1 && t.right_tree == -1) print(t.data); if(t.left_tree != -1) q.push(T[t.left_tree]); if(t.right_tree != -1) q.push(T[t.right_tree]); } printf("\n"); } return 0; }
-
7-1 列出叶结点
2019-10-26 13:58:337-1 列出叶结点 (40 分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行...7-1 列出叶结点 (40 分)
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。输入样例:
8
1 -0 -
2 75 -
4 6
输出样例:
4 1 5我的看法
这道题目重点在于存储数据和如何遍历数据找到并输出树的叶子。
我一开始是想用指针建一棵树,后来发现太麻烦。麻烦也就算了,还不知道建好的树如何层序遍历。于是把指针树都删掉了,直接存到数组里面。
另外,在网上查了一下如何层序遍历一棵树,找到了递归的思路——写递归函数的时候记录一下相应的层就OK,其实还是先序遍历,只不过通过先序遍历把每一层的元素存到了一个vector数组里面,然后再根据层数,从vector【0】开始遍历每一个vector里面所有的元素,这样下来,就相当于一个层序从左往右的遍历啦!
其实也不一定用vector,所有能充当二元数组的数据结构都可以,只不过一般的数组需要下标访问,而我们不知道每一层具体有几个元素,所以queue数组也是可以哒~
另外,对于树根的查找,其实就是在创建这个数组树的时候,记录一下哪个节点没有出现在其他节点的左右孩子上,你会发现,就一个这样的点,即孤儿——祖宗,也就是树根。
而对于格式问题,我一开始是大大咧咧地cout了“叶子 空格”的,发现都是格式错误。这个题格式要求前后都没有空格的,所以输出的时候要加一个判断,将空格放在树叶前面,而第一个树叶前面不加空格。
AC代码如下:#include<iostream> #include<vector> using namespace std; struct node { char left, right; } ; node treenode[11]; vector <int> leaf[11]; void cengxubianli(int root, int level) { if (treenode[root].left == '-' && treenode[root].right == '-') { leaf[level].push_back(root); return; } if (treenode[root].left != '-') cengxubianli(treenode[root].left - '0', level + 1); if (treenode[root].right != '-') cengxubianli(treenode[root].right - '0', level + 1); } int main() { int n, findroot[11], reallyroot = 0; for(int i=0;i<11;i++) findroot[i]=0; cin >> n; for (int i = 0; i < n; i++) { cin >> treenode[i].left >> treenode[i].right; findroot[treenode[i].left - '0'] = findroot[treenode[i].right - '0'] = 1; } for (int i = 0; i < n; i++) if (findroot[i]==0) { reallyroot = i; break; } cengxubianli(reallyroot, 1); bool first=false; for (int i = 1; i <= 10; i++) { for (int j = 0; j < leaf[i].size(); j++) { if(first)cout<<" "; else first=true; cout << leaf[i][j]; } } system("pause"); return 0; }
-
-
树案例—列出叶结点
2020-08-25 20:55:24基础实验4-2.2 列出叶结点 (25分) 建树+层序遍历 运行结果 代码 #include <iostream> #include <queue> #include <cstring> using namespace std; #define NUL -1 typedef struct TreeNode *... -
7-7列出叶结点
2018-11-26 18:46:587-7列出叶结点 (25 分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后... -
PTA 列出叶结点 (25分)
2020-10-26 16:32:18PTA 列出叶结点 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出... -
重启c语言之树——列出叶结点
2020-05-23 22:43:07列出叶结点 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个... -
列出叶结点【递归】【二叉树】
2020-11-22 21:08:53列出叶结点【递归】【二叉树】 题目详情 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 ... -
7-4 列出叶结点 (25分) AC代码
2020-04-18 18:10:427-4 列出叶结点 (25分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每... -
pta-7-40 列出叶结点 (25分)
2020-01-27 15:38:29pta-7-40 列出叶结点 (25分) 题目 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后... -
7-1 列出叶结点(25 分)
2018-03-28 20:11:037-1 列出叶结点(25 分)对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。输入格式:首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N ... -
基础实验4-2.2-列出叶结点-函数题
2020-04-03 17:24:04基础实验4-2.2-列出叶结点-函数题解题代码测试结果问题整理 解题代码 #include<stdio.h> #include<stdlib.h> typedef struct queue que; struct queue { int left; int right; }; int main() { int N... -
7-1 列出叶结点 (40分)(c++)
2020-10-31 10:42:027-1 列出叶结点 (40分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每... -
pta树的同构与列出叶结点(详解)
2020-04-08 22:30:03列出叶结点 这题我看网上,其他人基本上都是用bfs写的,这题我没用,收到了上题的启发,这是我自己写的,写的比较简单,好理解,也能是因为数据比较小,所以就能水过去 树的同构 给定两棵树T1和T2。如果T... -
7-16 列出叶结点 (25分)/(C语言实现)
2020-04-08 17:43:207-16 列出叶结点 (25分)/(C语言实现) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。... -
7-1 列出叶结点(25 分) 【数据结构】
2019-10-02 17:49:497-1 列出叶结点(25 分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N ... -
浙大PTA 7-4 列出叶结点 (20point(s))
2020-05-06 14:31:427-4列出叶结点(20point(s)) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。 输入格式: 首先第一行给出一个正整数N(≤10),为树中结点总数。树中的结点从 0 到N−1编号。随后N行,... -
列出叶结点(PTA)
2020-12-15 11:48:44首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。 输出... -
7-9 列出叶结点
2020-06-21 10:51:49首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。 输出... -
列出叶结点 pta简单易懂
2019-06-09 18:53:04随后N行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。 输出格式: 在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余....