二叉树遍历输出的递归和非递归实现
来源:互联网 发布:php final static 编辑:程序博客网 时间:2024/05/16 15:01
(一) 根据二叉树遍历操作的递归定义,可以很容易的写出在二叉树链表上实现二叉树遍历的递归算法,代码如下:
//前序遍历
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
- 二叉树遍历输出的递归和非递归实现
- 二叉树的遍历:递归和非递归实现
- 二叉树遍历的递归和非递归实现
- 二叉树创建、遍历的递归和非递归实现
- 二叉树的遍历(非递归和递归实现)
- 二叉树的前中后序遍历-递归和非递归实现
- 二叉树遍历的递归和非递归实现
- 二叉树的遍历实现(递归和非递归)
- 递归和非递归实现二叉树的后续遍历
- Python实现二叉树的递归和非递归遍历
- 二叉树的遍历---递归和非递归实现
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉搜索树的递归遍历和非递归遍历
- java 二叉树的递归遍历和非递归遍历
- leetcode 二叉树前序遍历的递归和非递归实现
- leetcode 二叉树中序遍历的递归和非递归实现
- 非递归实现二叉树的遍历
- VM Depot 登陆中国!
- MySQL 权限系统
- struts 动态调用
- 程序员感叹
- Max Points on a Line
- 二叉树遍历输出的递归和非递归实现
- rac_安装软件时报版本过高问题
- HDU 4166 Robot Navigation
- ArgumentError: Error #1063: BasicChart/dataFunc() 的参数数量不匹配。应该有 2 个,当前为 3 个。
- activity各种方法在点击时的区别
- uva 10285(dp)
- Divide Two Integers
- ubuntukylin14.04下github 常用操作
- UVA10285(DP)