avatar
请教一道g算法题# JobHunting - 待字闺中
p*y
1
就是一棵树或者森林,让你依次摘掉并打印叶节点;然后循环上述步骤,直到把树消干净
应该怎么个思路?
请大家讨论一下
avatar
r*7
2
怎么个依次法?
我感觉就是后序遍历啊,还是哪儿理解的有偏差?

干净

【在 p*y 的大作中提到】
: 就是一棵树或者森林,让你依次摘掉并打印叶节点;然后循环上述步骤,直到把树消干净
: 应该怎么个思路?
: 请大家讨论一下

avatar
l*8
3
拓扑排序?

干净

【在 p*y 的大作中提到】
: 就是一棵树或者森林,让你依次摘掉并打印叶节点;然后循环上述步骤,直到把树消干净
: 应该怎么个思路?
: 请大家讨论一下

avatar
k*4
4
节点按照他们离最远的在其子树中的叶子节点的距离分配到不同的vector里面,
void push_nodes(unordered_map> &nodes, TreeNode *root
, int len)
{
if (nodes.find(len) == nodes.end())
{
vector temp(1, root);
nodes[len] = temp;
}
else
nodes[len].push_back(root);
return;
}
int printAndDeleteLeavesHelper(TreeNode *root, unordered_mapTreeNode*>> &nodes)
{
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
{
push_nodes(nodes, root, 1);
return 1;
}
int from_left = printAndDeleteLeavesHelper(root->left, nodes);
int from_right = printAndDeleteLeavesHelper(root->right, nodes);
int max_len_from_leaves = max(from_left, from_right);
push_nodes(nodes, root, max_len_from_leaves);
return max_len_from_leaves;
}
void printTree(TreeNode *root)
{
if (root == NULL)
return;
unordered_map(int, vectorprintAndDeleteLeavesHelper(nodes, root);
int i=1;
while (nodes.find(i) != nodes.end())
{
for(int j=0; jprint nodes[i][j];
}
return;
}
avatar
k*4
5
时间和空间复杂度都是
O(树的大小)。
avatar
s*c
6
是二叉树么,还是个graph,有环没?
要不就按层打印,倒着打,打印完了就削掉

干净

【在 p*y 的大作中提到】
: 就是一棵树或者森林,让你依次摘掉并打印叶节点;然后循环上述步骤,直到把树消干净
: 应该怎么个思路?
: 请大家讨论一下

avatar
u*x
7
问下
是否先打印当前所有叶节点
然后virtually除去这一圈叶节点
以上做为一个iteration

干净

【在 p*y 的大作中提到】
: 就是一棵树或者森林,让你依次摘掉并打印叶节点;然后循环上述步骤,直到把树消干净
: 应该怎么个思路?
: 请大家讨论一下

avatar
u*x
8
是指按各节点所在高度打印 是吧
叶节点高度为0
然后打印高度为1的节点
依次类推

root

【在 k******4 的大作中提到】
: 节点按照他们离最远的在其子树中的叶子节点的距离分配到不同的vector里面,
: void push_nodes(unordered_map> &nodes, TreeNode *root
: , int len)
: {
: if (nodes.find(len) == nodes.end())
: {
: vector temp(1, root);
: nodes[len] = temp;
: }
: else

avatar
k*4
9
空树对应0,叶子是1,依次类推。

【在 u****x 的大作中提到】
: 是指按各节点所在高度打印 是吧
: 叶节点高度为0
: 然后打印高度为1的节点
: 依次类推
:
: root

avatar
k*4
10
我居然惯性得认为是二叉树,这点确实需要等待Lz明确下。

【在 s***c 的大作中提到】
: 是二叉树么,还是个graph,有环没?
: 要不就按层打印,倒着打,打印完了就削掉
:
: 干净

avatar
k*4
11
我理解是这个意思,但是需要等lz明确下是否二叉树。

【在 u****x 的大作中提到】
: 问下
: 是否先打印当前所有叶节点
: 然后virtually除去这一圈叶节点
: 以上做为一个iteration
:
: 干净

avatar
h*k
12
我觉得如果每次只删除叶节点的话就dfs,因为不一定每次删的leaf在同一个高度:
while(root has children) {
helper(root, root.left);
helper(root, root.right);
}
helper(Node parent, Node child) {
if (child has no children){
parent.left/right = null; // check if its left or right of parent.
} else {
helper(child, child.right);
helper(child, child.left);
}
}
当然复杂度有点高。。
avatar
a*u
13
re.
用个Queue来存度数为1的点。

【在 l*********8 的大作中提到】
: 拓扑排序?
:
: 干净

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。