查找—二叉树平衡因子(用数组构建二叉树)

题目如下:

题目描述

二叉树用数组存储,将二叉树的结点数据依次自上而下,自左至右存储到数组中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点在数组中用0来表示。

计算二叉树每个结点的平衡因子,并按后序遍历的顺序输出结点的平衡因子。

--程序要求--

若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio

程序中若include多过一个头文件,不看代码,作0分处理

不允许使用第三方对象或函数实现本题的要求

输入

测试次数t

每组测试数据一行,数组元素个数n,后跟n个字符,二叉树的数组存储。

输出

对每组测试数据,按后序遍历的顺序输出树中结点的平衡因子(测试数据没有空树)


输入样例1

2
6 ABC00D
24 ABCD0EF0000H00000000000I

输出样例1

B 0
D 0
C 1
A -1
D 0
B 1
I 0
H 1
E 2
F 0
C 2
A -2

二叉树用数组构建

在数组中 父亲的下标为pos 则左右子树的下标为2*pos+1和2*pos+2(以0为开头)

如果下标从1开始的 则为2*pos和2*pos+1

node* creattree(int pos)
	{
		node* t;

		if (pos >= len)
		{
			return nullptr;
		}
		else
		{
			if (str[pos] != '0')
			{
				t = new node;
				t->data = str[pos];

				t->left = creattree(2 * pos + 1);
				t->right = creattree(2 * pos + 2);
			}
			else
			{
				t = nullptr;
			}
		}
		pos++;
		return t;
	}

  别忘了pos要++;


另外计算树的深度也是关键:

int height(node* t)
	{
		int dep1 = 0, dep2 = 0;

		if (t == nullptr)
		{
			return 0;
		}
		else
		{
			dep1 = height(t->left);
			dep2 = height(t->right);
			int max_ = max(dep1, dep2) + 1;
			return max_;
		}
	}

输出:

题目要求要用后序遍历

void show(node* t)
	{
		if (t)
		{
			show(t->left);
			show(t->right);
			cout << t->data << " " << height(t->left) - height(t->right) << endl;
		}
		else
		{
			return;
		}
	}

完整代码如下:

#include <iostream>
using namespace std;

class node
{
public:
	char data;
	node* left, * right;

	node() :data('0'), left(nullptr), right(nullptr) {}
};

class tree
{
public:
	node* root;
	string str;
	int pos;
	int len;

	tree(string str_)
	{
		this->str.assign(str_);
		this->pos = 0;
		this->len = str.length();
		this->root = creattree(0);
	}

	node* creattree(int pos)
	{
		node* t;

		if (pos >= len)
		{
			return nullptr;
		}
		else
		{
			if (str[pos] != '0')
			{
				t = new node;
				t->data = str[pos];

				t->left = creattree(2 * pos + 1);
				t->right = creattree(2 * pos + 2);
			}
			else
			{
				t = nullptr;
			}
		}
		pos++;
		return t;
	}

	void show(node* t)
	{
		if (t)
		{
			show(t->left);
			show(t->right);
			cout << t->data << " " << height(t->left) - height(t->right) << endl;
		}
		else
		{
			return;
		}
	}

	int height(node* t)
	{
		int dep1 = 0, dep2 = 0;

		if (t == nullptr)
		{
			return 0;
		}
		else
		{
			dep1 = height(t->left);
			dep2 = height(t->right);
			int max_ = max(dep1, dep2) + 1;
			return max_;
		}
	}
};

int main()
{
	int t;
	cin >> t;

	while (t--)
	{
		int index;
		cin >> index;

		string str;
		cin >> str;

		tree T(str);
		T.show(T.root);
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值