【树的应用】——列出叶结点 (25分)(附测试点)

80 篇文章 7 订阅
77 篇文章 11 订阅

对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

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

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

输入样例:

8
1  -
-  -
0  -
2  7
-  -
-  -
5  -
4  6

输出样例:

 4 1 5
这道题我做的可谓是错误百出,在编译器上不知道编译了多少次。。刚开始用的指针、结构体,就是真正构造一棵二叉树那样的过程,到后边发现左孩子右孩啥的不好搞了,我觉得应该也可以做,但我懒,没试,最后用的三个整型变量封装的结构体作为树的结点。之前做过一些题,这种数组等形式的表示链表、指针结构,空可以设为-1(前提保证没有结点的数据或者键为-1,否则错误,到时可以选择换一个不会影响的数据或者采用其他方式),再就是只有指针才是->访问,其他是.运算符,我。。服了我自己了
关键是找出根结点,通过观察你会发现,唯一没有直接出现的数就是根结点,样例中出现了0,1,2,4,5,6,7,没有3,所以3就是根结点,然后再从3开始遍历左子树和右子树,进行同样的判断入队等操作。从上到下,从左到右是很明显的层次遍历操作,层次遍历使用队列,注意输出。

样例给出最终二叉树结构如图(手写)
在这里插入图片描述

data域存储结点的键值,即0~N-1,由于输入也是输入的字符(因为有’-’,所以统一按字符输入),但最后转为结点时是整型,存储用int,输入字符后进行-'0’操作再转换即可。

在这里插入图片描述

#include <iostream>
#include <queue> 
using namespace std;

typedef struct{
	int data;
	int left,right;
}Node;

Node node[10];
bool flag[10] = {false};

void order(Node no){
	queue<Node> qe;
	qe.push(no);
	int len = 0;
	while(!qe.empty()){
		Node t = qe.front();
		if(t.left==-1&&t.right==-1){
			len++;
			if(len==1)
				cout << t.data;
			else
				cout << " " << t.data;
		}
		qe.pop();
		if(t.left!=-1)
			qe.push(node[t.left]);
		if(t.right!=-1)
			qe.push(node[t.right]);
	}
} 

int main(){
	ios::sync_with_stdio(false);
	int n;
	char a,b;
	cin >> n;
	for(int i = 0;i<n;i++){
		cin >> a >> b;
		node[i].data = i;
		if(a!='-'){
			node[i].left = a-'0';
			flag[a-'0'] = true;
		}else{
			node[i].left = -1;
		}
		if(b!='-'){
			node[i].right = b-'0';
			flag[b-'0'] = true;
		}else{
			node[i].right = -1;
		}
	}
	int root;
	for(int i = 0;i<n;i++){
		if(!flag[i]){
			root = i;
			break;
		}
	}
	order(node[root]);
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值