当前位置: 首页>移动开发>正文

UVA-712-S-Trees-完全二叉树

注意:本文只给出作者认为必要的知识点并且可能存在疏漏。

目录

  • 一、题目大意
  • 二、理论基础
    • 1. 二叉树
      • 1.1 二叉树的定义
      • 1.2 二叉树的性质
    • 2. 满二叉树
    • 3. 完全二叉树
      • 3.1 完全二叉树的定义
      • 3.2 完全二叉树的性质 `本题重点`
  • 三、解题思路
  • 四、参考代码

一、题目大意

  给一颗 深度 为 n完全二叉树 ,每一层的 非终端结点 都有特定值 Xi(1、0),从根结点开始向下走,若当前 Xi 的值为1则向右子树深入,否则向左子树深入,输出到达 叶子结点 的值。其有 2n 个叶子结点,叶子结点的值按序给出,但 Xi 的排列为无序。原题链接


二、理论基础

1. 二叉树

1.1 二叉树的定义

1.2 二叉树的性质

  1. 在二叉树的第 i 层上至多有 2i-1 个结点。 i ≥ 0 \textcolor{#FF0000}{i \geq 0} i0
  2. 深度为 k 的二叉树最大结点数为 ∑ i = 1 k = 2 k − 1 , k ≥ 1 {\sum_{i=1}^{k}=2^k-1}, \textcolor{#FF0000}{k \geq 1} i=1k=2k1,k1
  3. 对于任意二叉树,若其终端结点数为 x,度为2的结点数为 y,则 x = y + 1 x=y+1 x=y+1

2. 满二叉树

3. 完全二叉树

3.1 完全二叉树的定义

3.2 完全二叉树的性质 本题重点

  1. 对于任意非终端结点 i,若其有左孩子,则必为结点 2 × i 2\times i 2×i
  2. 对于任意非终端结点 i,若其有右孩子,则必为结点 2 × i + 1 2\times i +1 2×i+1

三、解题思路


四、参考代码

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 129
#define INF 0x3f3f3f
typedef long long ll;


int main() {
	int n, order[7], Case = 1, T, base;
	char c[3],  stemp[8], s[maxn];
	vector<int> result;
	result.reserve(maxn * 4);//优化速度
	ios::sync_with_stdio();
	cin.tie(0);
	cout.tie(0);

	while (cin >> n && n) {
		result.clear();//清空
		base = 1 << n;
		for (int i = 0; i < n; ++i) {
			cin >> c;
			order[i] = c[1] - '1';
		}
		cin >> s >> T;
		for (int i = 0; i < T; ++i) {
			int itemp = 1;
			cin >> stemp;
			for (int j = 0; j < n; ++j) {
				itemp <<= 1;
				itemp += stemp[order[j]] == '0' ? 0 : 1;//右孩子加1
			}
			result.push_back(s[itemp - base] - '0');//itemp为叶子结点的编号
		}
		cout << "S-Tree #" << Case++ << ':' << endl;
		for (int i = 0; i < result.size(); ++i)
			cout << result[i];
		putchar('\n');
		putchar('\n');
	}
	return 0;
}

  1. 数据结构(C语言版) [专著] / 严蔚敏,吴伟民编著 ↩︎ ↩︎


https://www.xamrdz.com/mobile/47n1848650.html

相关文章: