二叉樹(先、中、後、層次遍歷,判斷同構和是否為完全二叉樹)
阿新 • • 發佈:2019-01-01
二叉樹基本操作
二叉樹的結構定義
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;
}