二叉树(先、中、后、层次遍历,判断同构和是否为完全二叉树)

二叉树的结构定义

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;
}

猜你喜欢

转载自blog.csdn.net/qq_36784975/article/details/83959193