二叉树遍历

ε祈祈猫儿з 提交于 2020-01-26 19:46:46

二叉树遍历
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;
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!