二叉树的遍历(不使用递归)

//前序遍历 根->左子树->右子树
void btree_foreach_prev2(BTree tree,void (*foreach)(T)){
if(tree == NULL)
return;
Stack s;
stack_init(&s,btree_size(tree));
stack_push(&s,tree);
while(!stack_is_empty(&s)){
BNode *node = stack_pop(&s);
foreach(node->data);
if(node->right!=NULL){
stack_push(&s,node->right);
}
if(node->left!=NULL){
stack_push(&s,node->left);
}
}
stack_destroy(&s);
}

//中序遍历 左子树=>根->右子树
void btree_foreach_mid2(BTree tree,void (*foreach)(T)){
if(tree == NULL)
return;
Stack s;
stack_init(&s,btree_size(tree));
BNode *p = tree;
while(p!=NULL||!stack_is_empty(&s)){
while(p!=NULL){
stack_push(&s,p);
p = p->left;
}
if(!stack_is_empty(&s)){
p = stack_pop(&s);
foreach(p->data);
p = p->right;
}
}
stack_destroy(&s);
}

//后序遍历 左子树->右子树->根
void btree_foreach_last2(BTree tree,void (*foreach)(T)){
if(tree == NULL)
return;
Stack s;
stack_init(&s,btree_size(tree));
Stack res;
stack_init(&res,btree_size(tree));
stack_push(&s,tree);
while(!stack_is_empty(&s)){
tree = stack_pop(&s);
stack_push(&res,tree);
if(tree->left!=NULL){
stack_push(&s,tree->left);
}
if(tree->right!=NULL){
stack_push(&s,tree->right);
}
}
while(!stack_is_empty(&res)){
tree = stack_pop(&res);
foreach(tree->data);
}
stack_destroy(&s);
stack_destroy(&res);
}

//按二叉树的层遍历
void btree_layer_foreach(BTree tree,void (*foreach)(T)){
if(tree == NULL){
return;
}
Queue que;
queue_init(&que,btree_size(tree));
queue_push(&que,tree);
while(!queue_is_empty(&que)){
BNode *node = queue_pop(&que);
foreach(node->data);
if(node->left != NULL){
queue_push(&que,node->left);
}
if(node->right != NULL){
queue_push(&que,node->right);
}
}
queue_destroy(&que);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值