数据结构树 —— 编程作业 02 :List Leaves

Posted 大彤小忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构树 —— 编程作业 02 :List Leaves相关的知识,希望对你有一定的参考价值。

  题目描述: 给定一棵树,按照从上到下、从左到右的顺序列出所有叶结点。

  输入格式: 每个输入文件包含一个测试用例。
        对于每种情况,第一行给出一个正整数N( ⩽ \\leqslant 10),为树中的结点总数,结点编号从0到N-1。
        接着是N行,每一行对应一个结点,并给出该结点的左、右子结点的索引。
        如果子结点不存在,则在相应位置上给出“-”。
        任何一对子结点都用一个空格隔开。

  输出格式: 对于每个测试用例,在一行中按从上到下、从左到右的顺序打印所有的叶结点索引。
        相邻数字之间必须有一个空格,行尾不能有多余的空格。

  输入样例:

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

  输出样例:

4 1 5

  代码实现:

#include<iostream>
using namespace std;
#define MaxTree 10
#define Null -1
#include<queue>

#define Tree int
struct TreeNode {
	Tree left;   // 左子树的下标 
	Tree right;  // 右子树的下标 
}T[MaxTree];

// 建二叉树,返回根结点
Tree BuildTree(struct TreeNode T[])
{
	int i, n;
	int check[MaxTree];  //创建一个check数组来确定根节点,若在静态链表中未出现的下标则为根节点
	char left, right;
	Tree root = Null;   //若n为0,返回Null

	cin >> n;
	if (n)
	{
		for (i = 0; i < n; i++)
		{
			check[i] = 0;
		}
		for (i = 0; i < n; i++)
		{
			cin >> left >> right;
			if (left != '-')
			{
				T[i].left = left - '0';   //若输入不为'-',那字符减去字符0转换为整型数值
				check[T[i].left] = 1; //把在静态链表中出现过的数值标记为1
			}
			else if (left == '-')
				T[i].left = Null;
			if (right != '-')
			{
				T[i].right = right - '0';
				check[T[i].right] = 1;
			}
			else if (right == '-')
				T[i].right = Null;
		}

		for (i = 0; i < n; i++)
		{
			if (!check[i])
				break;
		}
		root = i;

	}
	return root;
}

//层序遍历,输出叶结点
void PrintLeava(int root)
{
	if (root == Null)  //如果根结点为空证明是空树
	{
		cout << "-1" << endl;
		return;
	}

	queue<int>q;
	q.push(root);
	int i = 0;
	int leave[MaxTree];
	while (!q.empty())
	{
		int s = q.front();
		q.pop();
		if (T[s].left == Null && T[s].right == Null)  //如果该结点既没有左孩子又没有右孩子就是叶子
		{
			leave[i++] = s;
		}
		else
		{
			if (T[s].left != Null)/*如果左孩子不为空就push左孩子*/
			{
				q.push(T[s].left);
			}
			if (T[s].right != Null)  //如果右孩子不为空就push右孩子
			{
				q.push(T[s].right);
			}
		}
	}
	for (int j = 0; j < i; j++)  //按顺序输出叶子
	{
		if (j < i - 1)  //相邻数字之间必须有一个空格
		{
			cout << leave[j] << " ";
		}
		else  //j=i-1为行尾不能有多余的空格
		{
			cout << leave[j];
		}
	}
}

int main()
{
	Tree root = BuildTree(T);
	PrintLeava(root);
	system("pause");
	return 0;
}

  测试: 输入样例的测试效果如下图所示。

在这里插入图片描述

以上是关于数据结构树 —— 编程作业 02 :List Leaves的主要内容,如果未能解决你的问题,请参考以下文章

数据结构树 —— 编程作业 08 :二叉搜索树的操作集

数据结构树 —— 编程作业 05 :是否同一棵二叉搜索树

数据结构树 —— 编程作业 07 :Complete Binary Search Tree

数据结构树 —— 编程作业 01 :树的同构

数据结构树 —— 编程作业 11 :Huffman Codes

数据结构树 —— 编程作业 09 :堆中的路径