二叉树的四种遍历函数

二叉树

二叉树结构定义如下

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

四种遍历方式分别是 中序先序后序层序

具体例子如下:

二叉树图解:
在这里插入图片描述
四种遍历输出:

Inorder: D B E F A G H C I   //中序
Preorder: A B D F E C G H I   //先序
Postorder: D E F B H G I C A   //后序
Levelorder: A B C D F G I E H   //层序

先序,中序,后序

都是用递归输出,只是根,左节点,右节点的输出顺序不一样

void InorderTraversal( BinTree BT ){//中序
    if(!BT)
        return;
    InorderTraversal(BT->Left);
    printf(" %c",BT->Data);
    InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ){ //先序
    if(!BT)
        return;
    printf(" %c",BT->Data);
    PreorderTraversal(BT->Left);
    PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){//后序
    if(!BT)
        return;
    PostorderTraversal(BT->Left);
    PostorderTraversal(BT->Right);
    printf(" %c",BT->Data);
}

层序

需要定义两个数组存节点,一个存当前节点并输出data,另一个存这个节点下的左右节点。

void LevelorderTraversal( BinTree BT ){//层序
    if(!BT)
        return;
    int len=1,pos;
    BinTree a[101],b[101];
    a[0]=BT;
    while(1){
        if(len==0)
            return;
        pos=0;
        for(int i=0;i<len;i++)
        {
            if(a[i]!=NULL)//不为空输出
                printf(" %c",a[i]->Data);
            if(a[i]->Left!=NULL)//如果它的左节点不为空,就存到b数组里
                b[pos++]=a[i]->Left;
            if(a[i]->Right!=NULL)//如果它的右节点不为空,就存到b数组里
                b[pos++]=a[i]->Right;
        }
        len=pos;//更新下一层宽度,为下一次循环做准备
        for(int i=0;i<len;i++)//将下层的b赋给a,为下一次循环做准备
            a[i]=b[i];
    }
}
发布了20 篇原创文章 · 获赞 9 · 访问量 1454

猜你喜欢

转载自blog.csdn.net/nntcdhl/article/details/105316068