7-1 列出叶结点

7-1 列出叶结点 (40 分)
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。

输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:
8
1 -

0 -
2 7

5 -
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;
}

posted @ 2019-10-26 14:08  爱和九九  阅读(293)  评论(0)    收藏  举报