二叉树遍历输出的递归和非递归实现

     (一)    根据二叉树遍历操作的递归定义,可以很容易的写出在二叉树链表上实现二叉树遍历的递归算法,代码如下:

//前序遍历

void forder(btnode *root)
{
if(root)
{
printf("%2d",root->data);

forder(root->left);
forder(root->right);
}
}

//中序遍历

void inorder(btnode *root)
{
if(root)
{
inorder(root->left);
printf("%2d",root->data);


inorder(root->right);
}
}

//后序遍历


void lorder(btnode *root)
{
    if(root)
{
lorder(root->left);

        lorder(root->right);
printf("%2d",root->data);
}
}


       上述算法语句简单,结构清晰,非常便于形式上的掌握。但值得注意的是,递归遍历时,一定要按约定的次序访问每一个局部的子树。形式上,三种遍历算法的区别仅表现在printf的位置不同,但由于对子树的遍历是递归调用,所以三种遍历结果差别还是挺大的。

        递归遍历算法的时间复杂度:对于有N个结点的二叉树,设访问每个结点的时间是常量级的,则时间复杂度均为O(n),其中,对每个结点都要经过递归调用和递归退出的控制处理过程。

(二)二叉树非递归遍历(前序,中序,后序)

//中序遍历


  void inorder(btnode *root)
{
btnode **s;
btnode *p;
int top;
s=(btnode **)malloc(1000*(sizeof(btnode *)));
top=-1;
p=root;
while(p!=NULL||top!=-1)
{
while(p!=NULL)
{
s[++top]=p;
p=p->left;
}
if(top!=-1)
{
p=s[top--];
printf("%2C",p->data);
p=p->right;
}
}
}


//前序遍历


void forder(btnode *root)
{
btnode **s;
btnode *p;
int top;
s=(btnode **)malloc(1000*(sizeof(btnode *)));
top=-1;
p=root;
while(p!=NULL||top!=-1)
{
while(p!=NULL)
{
printf("%2C",p->data);
s[++top]=p;
p=p->left;
}
if(top!=-1)
{
p=s[top--];

p=p->right;
}
}
}


//后序遍历


void lorder(btnode *root)
{
btnode **s;
btnode *p,*q;
int top;
s=(btnode **)malloc(1000*(sizeof(btnode *)));
top=-1;
p=root;
q=NULL;
while(p!=NULL||top!=-1)
{
while(p!=NULL)
{

s[++top]=p;
p=p->left;
}
if(top!=-1)
{ p=s[top--];
if(p->right==NULL||(p->right==q))
{p=s[top--];
   printf("%2C",p->data);
p=p->right;
}
else
p=p->right;
}
}
}

       非递归算法的时间复杂度:上述三个算法本质都是控制每个结点进栈,出栈一次,每个结点访问一次。有N个结点,非递归算法时间复杂度为O(n);


       递归算法比非递归算法占用时间,空间资源都多。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值