Redian新闻
>
问个问题post order traveral using interation
avatar
问个问题post order traveral using interation# JobHunting - 待字闺中
l*r
1
请教大家, post order traveral using interation , 怎么做最好呢? 能不能在结
点里记录是否visit 过呢?
in-order 和pre-order的不用记录, 但是post-order的还是没有想出来。
avatar
r*u
2
current = root; //start traversal at root node
v = 0;
if(current is NULL)‏
the binary tree is empty
if(current is not NULL)‏
push current into stack;
push 1 onto stack;
current = current->llink;
while(stack is not empty)‏
if(current is not NULL and v is 0)‏
{
push current and 1 onto stack;
current = current->llink;
}

【在 l*********r 的大作中提到】
: 请教大家, post order traveral using interation , 怎么做最好呢? 能不能在结
: 点里记录是否visit 过呢?
: in-order 和pre-order的不用记录, 但是post-order的还是没有想出来。

avatar
B*t
3
not tested code.
void postOrderTraveral(Node *root) {
stack s;
Node *pre, *cur;
cur = root;
while(!s.empty()||cur) {
while(cur) {
s.push(cur->right);
cur = cur->left;
}
cur = s.top();
if(cur==pre||cur->right==NULL) {
visit(cur);
pre = cur;
cur = NULL;
s.pop()
}
else cur = cur->left;
}
}
avatar
h*0
4
I guess LZ's meaning is to use "iteration"? but not "interaction"?

【在 l*********r 的大作中提到】
: 请教大家, post order traveral using interation , 怎么做最好呢? 能不能在结
: 点里记录是否visit 过呢?
: in-order 和pre-order的不用记录, 但是post-order的还是没有想出来。

avatar
b*h
5
用两个stack
void nonrec_postorder()
{
stack stk1;
stack stk2;
if(root != NULL)
stk1.push(root);
while(!stk1.empty()) {
Node* tmp = stk1.top();
stk1.pop();
stk2.push(tmp);
if(tmp->left != NULL)
stk1.push(tmp->left);
if(tmp->right != NULL)
stk1.push(tmp->right);
}
while(!stk2.empty()) {
printf("%d ", stk2.top()->ke
avatar
f*r
6
Needs a stack & one per-element flag.
void postOrderTraversal(Tree *head) {
Stack s;
head->settag(0);
s.push(head);
while (!s.empty()) {
Tree *node = s.top();
if (node->left == NULL && node->right == NULL ||
node->tag() == 1) {
print node->value;
s.pop();
}
if (node->right != NULL) {
s.push(node->right);
}
if (node->left != NULL) {
s.push(node->left);
}
node->settag(1);
}
}
avatar
l*r
7
哦,必须要用到per-order flag是吧, 如果不用,有没有办法呢?
avatar
l*r
8
哦,没有看到两个stack的solution. 好办法,谢谢。
avatar
l*s
9
个人意见:
1) flag per node: 需要修改数据结构。当然,可以用 hash table来代替,但总觉得
不 elegant;
2)two stacks: 好主意,代码很好写,很 elegant。但用的空间相对多一些,至少是
O(n)
3)只用一个 stack,同时用一个 prev 表示前一个被打印的。代码也比较好写,就是
得判断一些 case,没有两个stack 来得漂亮。但空间相对少。如果树是 balanced的话
,只要 O(logn) [直观地,每个level最多只有2两个结点同时在栈中]。
4)在栈中设置一些特殊标志:当遇到特殊标志,我们就知道栈顶结点应该要打印了。
idea 很不错,直观,代码也好写, elegant。空间最好的情况也是 O(logn)。

【在 l*********r 的大作中提到】
: 哦,没有看到两个stack的solution. 好办法,谢谢。
avatar
w*1
10
在栈中设置一些特殊标志:当遇到特殊标志,我们就知道栈顶结点应该要打印了。
谁能具体说下这个怎么弄啊?? 想了半天也没想出来...
谢谢
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。