由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 按层遍历二叉树,常量空间,如何做到?
相关主题
Cormen星号题:O(n)遍历二叉树,只能用O(1) extra space问题请教
请问遍历树可以用for loop来完成吗?怎么用lex处理DFA?
[合集] 请问binary searth tree的遍历问题。面题:copy directed graph
top 4 IT company interview question looking for answer[合集] 给定一个最小堆,如何查找某数是否存在此堆中?
我觉得python,ruby之类实现基于tree structure的算法,不那么直观,也没优势请教个算法加编程
[合集] 二叉树的实现讨论 找单链表倒数m的节点 (转载)
今天面了个老印问个树遍历的线程化问题
求教:根据给定数组创建二叉树问个图的问题
相关话题的讨论汇总
话题: root话题: 节点话题: index话题: arr话题: visit
进入Programming版参与讨论
1 (共1页)
e****d
发帖数: 333
1
百思不得其解,等大师们指教。
d***a
发帖数: 13752
2
有计算复杂度的要求吗?

【在 e****d 的大作中提到】
: 百思不得其解,等大师们指教。
e****d
发帖数: 333
3
如果线性复杂度,应该是做不到的,我觉得。
a****l
发帖数: 8211
4
节省空间的必然浪费时间。常量的空间就需要平方的时间。

【在 e****d 的大作中提到】
: 百思不得其解,等大师们指教。
w***g
发帖数: 5958
5
得构造合适的数据结构. 每个节点两个指针只想儿子节点那种明显不行.

【在 e****d 的大作中提到】
: 百思不得其解,等大师们指教。
c*********e
发帖数: 16335
6
按层遍历二叉树,无非就是把每个节点当作数组arr里的一個元素,一個index对应一個
节点。比如根节点index=0 (2的0次方 减 1),第二层的最左边那个节点index=1 (2
的一次方 减 1),第三层的最左边那个节点的index=3 (2的二次方 减 1 )第四层的最
左边那个节点的index=7 (2的三次方 减 1),etc.
所以,第一层就是arr[0]; (最左边节点index 0 为 2的0次方 减 1)
第二层就是arr[1],arr[2]; (最左边节点index 1 为 2的1次方 减 1,最右边节点
index 2 为 下一层第一個节点的index(值为3) 减 1)
第三层就是arr[3],arr[4],arr[5],arr[6]; (最左边节点index 3 为 2的2次方 减 1
,最右边节点index 6 为 下一层第一個节点的index(值为7) 减 1)
etc.
这样就可以按层遍历了。

【在 e****d 的大作中提到】
: 百思不得其解,等大师们指教。
c*********e
发帖数: 16335
7
多加几个指针,存当前的层的第一個节点的指针的值和上2层的第一個节点的指针的值。

【在 e****d 的大作中提到】
: 百思不得其解,等大师们指教。
r*****e
发帖数: 792
8
A linear time constant space solution:
The key idea is to use DFS to visit the tree in BFS fashion.
void visit(Node *root, int height) {
if (height==1) cout<< root->value;
else {
if (root->left) visit(root->left, height-1);
if (root->right) visit(root->right, height-1);
}
}
void visitBFS(Node *root) {
if (!root) return;
int heightOfTree = getHeight(root);//will not define here
for (int h=1; h<=heightOfTree; ++h) {
visit(root, h);
}
}

【在 e****d 的大作中提到】
: 百思不得其解,等大师们指教。
Y**G
发帖数: 1089
9
这一递归,用的空间就不是常数O(1)了

【在 r*****e 的大作中提到】
: A linear time constant space solution:
: The key idea is to use DFS to visit the tree in BFS fashion.
: void visit(Node *root, int height) {
: if (height==1) cout<< root->value;
: else {
: if (root->left) visit(root->left, height-1);
: if (root->right) visit(root->right, height-1);
: }
: }
: void visitBFS(Node *root) {

s*****n
发帖数: 5488
10
如果可以破坏树的结构是可以的,思路是把二叉树,转换为兄弟树。
第一遍转化为兄弟树后,则rightchild指针省下来了,那么值想
p->leftchild->sibling->next = p->next->leftchild, 这样就构成了一张linkedlist
per level.然后for level, print linkedlist.
我估计最后兄弟树还可以恢复为二叉树。
不过这个方法算是很闲的蛋疼了。

【在 e****d 的大作中提到】
: 百思不得其解,等大师们指教。
1 (共1页)
进入Programming版参与讨论
相关主题
问个图的问题我觉得python,ruby之类实现基于tree structure的算法,不那么直观,也没优势
算法的课怎么这么难???[合集] 二叉树的实现
这个题目能否半小时完成coding?今天面了个老印
请问图形搜索所有路径问题求教:根据给定数组创建二叉树
Cormen星号题:O(n)遍历二叉树,只能用O(1) extra space问题请教
请问遍历树可以用for loop来完成吗?怎么用lex处理DFA?
[合集] 请问binary searth tree的遍历问题。面题:copy directed graph
top 4 IT company interview question looking for answer[合集] 给定一个最小堆,如何查找某数是否存在此堆中?
相关话题的讨论汇总
话题: root话题: 节点话题: index话题: arr话题: visit