二叉树的四种遍历及叶子.深度

来源:互联网 发布:清风算法 编辑:程序博客网 时间:2024/04/29 13:27



二叉树http://baike.baidu.com/view/88806.htm?fr=aladdin百科

</pre></p><p></p><p><span style="font-size:24px;">三种常规遍历还有层次遍历(<span><span style="font-size:18px;"><strong>即按照层次访问,通常用</strong></span></span><a target=_blank href="http://baike.baidu.com/view/38959.htm" target="_blank"><span style="font-size:18px;"><strong>队列</strong></span></a><span><strong><span style="font-size:18px;">来做。访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同</span>)</strong></span>)</span></p><p><span style="font-size:24px;"><img alt="" src="http://img.blog.csdn.net/20140827152002526?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSDBzMFk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" /></span></p><p><span style="font-size:24px;">建树</span></p><p><span style="font-size:24px;">给出二叉树的先序遍历序列abc,,de,g,,f,,,</span></p><span style="font-size:24px;"></span><pre class="csharp" name="code"> node *build(struct node *t){    char x;    scanf("%c",&x);    if ( x != ',')    {        t = (struct node *)malloc (sizeof (struct node));        t -> data = x;//先加根节点        t -> l = build (t->l);//左        t -> r = build (t->r);//右    }    else//','为空节点        t = NULL;    return t;}


遍历方式:

遍历方式很重要,首先要知道如何遍历,才能打出代码,现在脑海里模拟一遍

一、先序遍历
    

    1.先访问根节点

    2.再访问左分支

    3.再访问右分支

上述图片二叉树的先序遍历:ABDGCEF


二、中序遍历
  
    1.先访问左分支
    2.在访问根节点
    3.再访问右分支
上述图片二叉树的中序遍历:DGBAECF

三、后续遍历

    1.先访问左分支
    2.再访问右分支

    3.再访问根节点

上述图片二叉树的后序遍历:GDBEFCA

四、层次遍历

就是从每一层按照从左至右的顺序,一次遍历该层所有的节点

采用环形队列的方法,进行访问

访问叶子节点


二叉树的深度


从当前节点的左右分支开始判断,谁大自增1


判断倆颗二叉树是否相似

1.所有节点的对应左右孩子都相同

2.如过 有任意俩种遍历方式相同,那么俩颗树就相同


代码模板:

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <algorithm>const int N = 1010;using namespace std;char a[100];struct node{    char data;    node *left;    node *right;};struct node *make(){    char c;    node *st;    c = getchar();    if(c=='X')        st = NULL;    else    {        st = (struct node *)malloc(sizeof(struct node));        st ->data = c;//已知为先序遍历,先填充根节点        st ->left = make();//递归形式填充左分支        st->right = make();//递归形式填充左分支    }    return st;}void First_Order(struct node *t )//先序遍历的递归形式{    if(t==NULL)        return ;    printf("%c -> ",t->data);    First_Order(t->left);    First_Order(t->right);}void First_Order_1(struct node *t)//先序遍历非递归形式{    struct node *stk[N],*p;    int top = -1;    if(t!=NULL)    {        top++;        stk[top] = t; //根节点进栈        while(top>-1)        {            p = stk[top];//出栈并访问该节点            top--;            printf("%c -> ",p->data);            if(p->right!=NULL)  //右孩子进栈            {                top++;                stk[top] = p->right;            }            if(p->left!=NULL)//左孩子进栈            {                top++;                stk[top] = p->left;            }        }    }}void Mid_Order(struct node *t)//中序遍历递归形式{    if(t==NULL)        return ;    Mid_Order(t->left);    printf("%c -> ",t->data);    Mid_Order(t->right);}void Mid_Order_1(struct node *t)//先序遍历非递归形式{    struct node *stk[N],*p;    int top = -1;    if(t!=NULL)    {         p = t;        while(top>-1 ||p!=NULL )// 遍历左分支        {           while(p!=NULL)     // 将当前t节点的左分支,全部压入栈           {               top++;               stk[top] = p;               p = p->left;           }           //while结束后,栈顶元素可能没有左分支节点或者左分支节点已经访问完毕           if(top>-1)           {               p = stk[top];//出栈 ,并打印               top--;               printf("%c -> ",p->data);               p = p->right;  // 遍历右分支           }        }    }}void Last_Order(struct node *t)//后序遍历递归形式{    if(t==NULL)        return ;    Last_Order(t->right);    Last_Order(t->left);    printf("%c -> ",t->data);}void Print_Leaf(struct node *t){    if(t!=NULL)    {        if(t->left==NULL && t->right==NULL)        {            printf("%c  ",t->data);        }            Print_Leaf(t->left);//访问左分支的叶子节点            Print_Leaf(t->right);//访问右分支的叶子节点    }}void Ceng_Order(struct node *t)//层次遍历,采用循环队列来实现{    struct node *que[N],*p;    int f,r;   //队列的头指针 和 尾指针    f = -1; r = -1;    que[++r] = t;  //根节点入队    while(f!=r)    {        f = (f + 1)% N; //防止队溢出        p = que[f]; //队列头结点 出队        printf("%c -> ",p->data);        if(p->left !=NULL)  // 将其左孩子 压入队列        {            r = (r + 1 )% N;            que[r] = p->left;        }        if(p->right !=NULL)  // 将其右孩子 压入队列        {            r = (r + 1 )% N;            que[r] = p -> right;        }    }}int shendu(struct node *t){    int x=0,y = 0;    if(t!=NULL)    {        x = shendu(t->left);        y = shendu(t->right);        if(x>y)            return(x+1);        else            return (y+1);    }    else        return 0;}/*bool Like(struct node *t1,struct node *t2)//判断俩颗树是否相似{    bool like1,like2;    if(t1==NULL && t2 ==NULL)        return true; //所有对应的分支都相同    else if(t1==NULL || t2 ==NULL)        return false;    else    {        like1 = Like(t1->left,t2->left);        like2 = Like(t1->right,t2->left);        return (like1 && like2); //返回的是 like1 与 like2的 与    }}*/int main(){    struct node *t;    t = make();//建树    puts("先序遍历,递归形式");    First_Order(t);    cout<<"END"<<endl<<endl;    puts("非递归形式");    First_Order_1(t);    cout<<"END"<<endl<<endl;    puts("中序遍历,递归形式");    Mid_Order(t);    cout<<"END"<<endl<<endl;    puts("非递归形式");    Mid_Order_1(t);    cout<<"END"<<endl<<endl;    puts("后序遍历,递归形式");    Last_Order(t);    cout<<"END"<<endl<<endl;    puts("层次遍历");    Ceng_Order(t);    cout<<"END"<<endl<<endl;  /*  puts("判断俩个二叉树是否相似");     输入两个二叉树.....    bool m = Like(t1,t2);        if(m==1)        printf("YES\n");    else        printf("NO\n");    cout<<endl;*/    puts("深度");    int du = shendu(t);    printf("%d\n",du);    puts("叶子节点为");    Print_Leaf(t);    cout<<endl<<endl;    return 0;}




0 0