1. 程式人生 > >二叉樹(先、中、後、層次遍歷,判斷同構和是否為完全二叉樹)

二叉樹(先、中、後、層次遍歷,判斷同構和是否為完全二叉樹)

二叉樹基本操作

二叉樹的結構定義

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild, *rchild, *parent;
}BiTNode, *BiTree;

二叉樹的建立(遞迴)

#include <malloc.h>
void CreateBiTree(BiTree &T) { char c; cin >> c; if(c == '*')T = NULL; else { T = (BiTree)malloc(sizeof(BiTNode)); T->data = c; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } }

訪問節點

void visit(BiTree T)
{
    if(T)
    {
        cout <<
T->data << " "; } }

先序遍歷

void PreTraverse(BiTree T)              //先序遍歷
{
    if(T)
    {
        visit(T);
        PreTraverse(T->lchild);
        PreTraverse(T->rchild);
    }
}

中序遍歷

void InOrderTraverse(BiTree T)          //中序排列
{
    if(T)
    {
        InOrderTraverse(
T->lchild); visit(T); InOrderTraverse(T->rchild); } }

後序遍歷

void PostOrderTraverse(BiTree T)        //後序遍歷
{
     if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        visit(T);
    }
}

層次遍歷

void LevelOrderTraverse(BiTree T)       //層次遍歷
{
    queue<BiTree>Q;
    BiTree p;
    if(T)
    {
        Q.push(T);

        while(!Q.empty())
        {
             p = Q.front();
             visit(p);
             Q.pop();
             if(p->lchild)
             {
                 Q.push(p->lchild);
             }
             if(p->rchild)
             {
                 Q.push(p->rchild);
             }
        }
    }
}

判斷是否同構

bool IsSimilar(BiTree T1, BiTree T2)   //判斷兩顆樹是否同構
{
    bool l, r;
    if(T1 == NULL && T2 == NULL)
    {
        return true;
    }
    else if(T1 == NULL || T2 == NULL)
    {
        return false;
    }
    else
    {
        l = IsSimilar(T1->lchild, T2->lchild);
        r = IsSimilar(T1->rchild, T2->rchild);
        return l&&r;
    }
}

判斷一顆二叉樹是否為完全二叉樹

#include <queue>
bool IsComplete(BiTree &T)   //判斷一顆二叉樹是否為完全二叉樹
{
    queue<BiTree> Q;
    BiTree p;
    if(T == NULL)            //空樹是一顆完全二叉樹
    {
        return true;
    }
    Q.push(T);

    while(!Q.empty())
    {
       p = Q.front();
       Q.pop();
       if(p)
       {
           Q.push(p->lchild);
           Q.push(p->rchild);
       }
       else
       {
           while(!Q.empty())
           {
               p = Q.front();
               Q.pop();
               if(p)
               {
                   return false;
               }
           }
       }
    }
    return true;
}