(面试前复习)二叉树遍历 递归与非递归实现

二叉树的遍历方式有前序遍历,中序遍历和后序遍历这三种方式,我们现在就定义一个数据结构树,如下:
struct Tree{
 Tree * lchild;
Tree * rchild;
Element data;//数据域
}
为了实现树的非递归遍历,这里我们需要增加一个数据结构站stack,其实,递归的实现是用系统自带的栈来实现的。
对应的前序遍历如下:
void preTraverse(Tree * t){
 if(t!=null){
  print(t->data);
  preTraverse(t->lchild);
 preTraverse(t->rchild);
}
}
非递归形式的实现如下:
void preTraverse(Tree* t){
  if(t==null)
   return ;
 Stack s ;
while(t!=null){
s.push(t);
print(t->data);
t= t->lchild;
}

while(!s.empty()){

Tree * temp = s.top()->rchild;
s.pop();
   while(temp!=null){
  s.push(temp);
     print(temp->data);
     temp= temp->lchild;
   }
;
}
}
中序遍历的递归形式如下:
void inOrderTraverse(Tree * t){

    if(t!=null){
     inOrderTraverse(t->lchild);
   print(t->data);
inOrderTraverse(t->rchild);
 }
}

中序遍历对应的非递归形式如下:
void inOrderTraverse(Tree * t){
if(t==null)
return;
Stack s;
 s.push(t);
Tree curr = t->lchild;
while(curr!=null || !s.empty()){
   
    while(curr!=null){
      s.push(t);
    curr = curr->lchild;
   }
curr = s.top();
s.pop();
print(cur->data);
curr = curr->rchild;
}
}
后序遍历对应的递归程序如下:
void postOrderTraverse(Tree * t){
  if(t!=null){
   postOrderTraverse(t->lchild);
  postOrderTraverse(t->rchild);
   print(t->data);
}
}
后序遍历对应的非递归程序如下:
void postOrder(Tree * t){
 if(t == null)
 return;
Stack s;
s.push(t);
Tree curr = t-lchild;
while(!s.empty()){
  while(curr ! = null){
    s.push(curr);
    curr = curr - > lchild;
   } 
curr = s.top();
if(curr->rchild == nulll ||curr->rchild == previsited ){
 print(curr->data);
prvisited = curr;
s.pop();
curr = null; //
}else{
curr = curr->right;
}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值