二叉树遍历
1.前序(先序):根 左 右 ==>A BDFE CGHI
2.中序:左 根 右 ==>DBEF A GHCI
3.后序:左 右 根 ==>DEFB GHIC A
错误笔记:后序和中序都是从左,这个左就是最左边这个数,不能单纯记为左下角这个数,我把他记成左下角这个数刚刚就产生了疑惑,图片里面这个D和E到底怎么安排,如果记为最左边就毫无疑惑是D。
遍历完左子树之后到了B结点这里,然后是到左下角,而不是最左边
4.层序:从上到下,从左到右
这个遍历的顺序是理解起来最简单的,但是代码实现起来却是最难的(个人观点),反正理解起来一定错不了,从上到下,从左到右。
A BC DEF GHI
代码实现
建立一个结构体链表来存储。
struct node
{
struct node *l;//left
struct node *r;//right
int data;
};
先序遍历:
void xian(struct node *t)
{
if(t==NULL)return;
printf("%d",t->data);//先输出结点data
xian(t->l);//遍历左子树
xian(t->r);//遍历右子树
}
中序遍历:
void zhong(struct node *t)
{
if(t==NULL)
return;
zhong(t->l);
printf("%d",t->data);
zhong(t->r);
}
后序遍历
void hou(struct node *t)
{
if(t==NULL)
return;
hou(t->l);
hou(t->r);
printf("%d",t->data);
}
层序遍历
void ceng(struct node *head)
{
struct node *temp,*ans[1010];
int top=0,tail=0;//头部和尾部
if(head)
{
ans[tail]=head;//把根结点存进数组
tail+=1;
while(top!=tail)
{
temp=ans[top++];
printf("%c",temp->data);
if(temp->l)//判断,若左支不为空,把左支存进数组
ans[tail++]=temp->l;
if(temp->r)//判断,若右支不为空,把右支存进数组
ans[tail++]=temp->r;
}
}
}
来源:CSDN
作者:Josephu.
链接:https://blog.csdn.net/m0_46193982/article/details/104083745