首页 > 试题广场 >

输入是一个多叉树节点的数组和长度,要求打印出每一个节点的总权

[问答题]
将一颗多叉树存储在一个txt文件中,格式如下:
id1,parentld1,weight1
id2,parentld2,weight2
id3,parentld3,weight3
.....
其中,一行表示一个节点,id表示节点的序号,parentld表示节点对应父节点的序号,weight表示该节点的权重,
根节点的parentld是自身id.请实现一个函数,输入是一个多叉树节点的数组和长度,要求打印出每一个节点的总权重
(总权重=节点自身权重+节点对应所有子节点的权重).自定义需要的数据结构,说明时间和空间复杂度(要求时间复杂度优先,空间复杂度尽量低)
#include <unordered_map>
#include <iterator>
#include <stdexcept>
#include <set>
#include <iostream>
using namespace std;

typedef struct {
	size_t id;
	size_t parentId;
	size_t weight;
} Node;

void print_weight_of_tree(Node array[], size_t len)
{
	if (len == 0) {
		return;
	}

	unordered_map<size_t, size_t> id_index;
	id_index.rehash(2 * len);
	for(size_t i = 0; i != len; i++) {
		id_index.emplace(array[i].id, i);
	}

	int *state = new int [len]();
	size_t *weight = new size_t [len];
	for(size_t i = 0; i != len; i++) {
		weight[i] = array[i].weight;
		//root node
		if(array[i].id == array[i].parentId)
			continue;
		auto it = id_index.find(array[i].parentId);
		if(it == id_index.end()) {
			throw logic_error("parent not Found");
		}
		//tag
		state[it->second] = 1;
	}
	bool end = false;
	set<size_t> new_leaf_index;
	while(!end) {
		for(auto leaf_index : new_leaf_index) {
			state[leaf_index] = 0;
		}
		new_leaf_index.clear();
		for(size_t i = 0; i != len; i++) {
			if(state[i] == 0) {
				size_t parent = array[i].parentId;
				//root node
				if(parent == array[i].id) {
					state[i] = -1;
					end = true;
					break;
				} else {
					size_t parent_index = id_index.find(parent)->second;
					new_leaf_index.insert(parent_index);
					weight[parent_index] += weight[i];
					state[i] = -1;
				}
			}
		}
	}

	for(size_t i = 0; i < len; i++) {
		cout << "id: " << array[i].id << " weight: " << weight[i] << endl;
	}
	delete [] state;
	delete [] weight;
}

int main()
{
	size_t len;
	cin >> len;
	Node *array = new Node[len];
	for(size_t i = 0; i != len; i++) {
		cin >> array[i].id >> array[i].parentId >> array[i].weight;
	}
	print_weight_of_tree(array, len);
        delete [] array;
	return 0;
}

思路:1、首先建立id_index的hash表,该表的作用为将节点id映射到节点在array中的下标,方便以后查询
           2、算法的主要思想是先处理叶子节点(叶子节点state为0),处理叶子节点时,将叶子节点的权重添加到其父节点上,并将叶子节点标记为删除(将对应的斯state设置为-1),这时原来高度为1的所有节点又变成新的叶子节点,然后迭代处理,直到处理完根节点
           3、其中state和weight分别为数组array中对应节点的状态(-1, 0, 1)和权重

发表于 2016-05-12 11:48:16 回复(0)
看不懂这题的意思,怎么输入时一个多叉树节点的数组呢?难道意思是打印一个森林?
发表于 2016-01-20 20:48:38 回复(0)

多叉树有几个叉?

struct TreeNode

{

int weight;

int parentid;

vector<int> childid;

};
广度优先
发表于 2015-11-22 13:26:59 回复(0)