#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
const int MaxLength = 30;//结点个数不超过30个
typedef struct BiTreeNode{
ElemType data;
struct BiTreeNode *lchild,*rchild;
}BiTreeNode,*BiTree;
void CreateBiTree(BiTree & T)
{
ElemType ch;
cin>>ch;
if(ch=='#')
T = NULL;
else{
if(!(T = new BiTreeNode))
exit(OVERFLOW);
T->data = ch; //生成跟结点
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);//构造右子树
}
}//CreateBiTree
void PreOrder(BiTree &T)//递归函数:先序遍历以T为根的二叉树
{
if(T!=NULL) //递归结束条件
{
PreOrder(T->lchild); //先序遍历根的左子树
cout<<T->data<<ends; //访问根结点
PreOrder(T->rchild); //先序遍历根的右子树
}
}
void InOrder(BiTree &T)//递归函数:中序遍历以T为根的二叉树
{
if(T!=NULL) //递归结束条件
{
cout<<T->data<<ends; //中序遍历根的左子树
InOrder(T->lchild); //访问根结点
InOrder(T->rchild); //中序遍历根的右子树
}
}
void PostOrder(BiTree &T)//递归函数:后序遍历以T为根的二叉树
{
if(T!=NULL) //递归结束条件
{
PostOrder(T->rchild); //后序遍历根的左子树
cout<<T->data<<ends; //访问根结点
PostOrder(T->lchild); //后序遍历根的右子树
}
}
void LevelOrder(BiTree T) //层序遍历
{
BiTree Q[MaxLength];
int front = 0,rear =0;
BiTree p;
if(T) //根结点入队
{
Q[rear] = T;
rear = (rear+1)%MaxLength;
}
while(front!=rear)
{
p = Q[front]; //队头元素出队
front = (front+1)%MaxLength;
cout<<p->data<<ends;
if(p->lchild) //左孩子不为空,入队
{
Q[rear] = p->lchild;
rear = (rear+1)%MaxLength;
}
if(p->rchild) //右孩子不为空,入队
{
Q[rear] = p->rchild;
rear = (rear+1)%MaxLength;
}
}
}
bool CompleteTree(BiTree T) //层序遍历是否为完全二叉树
{
BiTree Q[MaxLength];
int front = 0, rear = 0;
BiTree p;
if(T == NULL) // 根结点入队
return true;
else{
Q[rear] = T;
rear = (rear+1)%MaxLength;
while(front != rear)
{
p = Q[front];//队头元素出队
front = (front+1)%MaxLength;
if(p)
{
Q[rear] = p->lchild;
rear = (rear+1)%MaxLength;
Q[rear] = p->rchild;
rear = (rear+1)%MaxLength;
}
else
{
while(front != rear)
{
p = Q[front];
if(p)
return false;
else
return true;
}
}
}
return true;
}
}
int DepthTree(BiTree T) //树的深度
{
int depthVal,depthLeft,depthRight;
if(!T)
depthVal = 0;
else
{
depthLeft = DepthTree(T->lchild);
depthRight = DepthTree(T->rchild);
depthVal = 1 + (depthLeft>depthRight ? depthLeft:depthRight);
}
return depthVal;
}
int CountNode(BiTree T) //树的结点数
{
int m,n;
if(!T)
return 0;
if(!T->lchild&&!T->rchild)
return 1;
else
{
m = CountNode(T->lchild);
n = CountNode(T->rchild);
return m+n+1;
}
}
int CountLeaf(BiTree T) //树的叶子数
{
int m,n;
if(!T)
return 0;
if(!T->lchild&&!T->rchild)
return 1;
else
{
m = CountLeaf(T->lchild);
n = CountLeaf(T->rchild);
return m+n;
}
}
二叉树树的基本算法
最新推荐文章于 2021-05-18 09:56:53 发布