二叉树的基本操作

二叉树的基本操作

1.创建对列
2.判断对列是否为空
3.入队列的操作
4.出队列操作
5.层次遍历
6.先序创建二叉树
7.中序遍历二叉树
8.后序遍历二叉树
9.树的深度
10.统计二叉树中节点的个数
11.统计二叉树的度为1的结点个数

#include <iostream>
using namespace std;
#define MAX 20
typedef struct Node//定义二叉树结构
{
    char data;
    struct Node *lchild,*rchild;//双叉树链表
}*BiTree,BiTNode;
typedef struct Queue//定义栈结构
{
	BiTNode *front;//队列头指针
	BiTNode *tail;//队列尾指针
	int size;//队列空间大小
}Queue;

//创建队列
int InitQueue(Queue &Q)
{
	Q.front = (BiTNode*)malloc(MAX * sizeof(BiTNode));
	if(!Q.front)
	{
		return 0;
	}
	Q.tail = Q.front;
	Q.size = MAX;
	return 1;
}

//判断队列是否为空
bool EmptyQueue(Queue Q)
{
	if(Q.tail == Q.front)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//入队列
int EnQueue(Queue &Q,BiTNode e)
{
	if((Q.tail - Q.front + MAX) % MAX == MAX - 1)
	{
		return 0;
	}
	*Q.tail = e;
	Q.tail++;
	return 1;
}

//出队列
int DeQueue(Queue &Q,BiTNode &e)
{
	if(Q.front == Q.tail)
	{
		return 0;
	}
	e = *Q.front;
	Q.front++;
	return 1;
}
//层次遍历
int levelTraverse(BiTree T)
{
	if(NULL == T)
	{
		return 0;
	}
	BiTNode e;
	Queue Q;
	int levelcount = 0;//树的深度
	int curlevel = 1;//本层剩余的未访问的节点数
	int nextlevel = 0;//下一层未访问的节点数
	InitQueue(Q);
	EnQueue(Q,*T);
	while(!EmptyQueue(Q))
	{
		DeQueue(Q,e);
		printf("%c ",e.data);
		curlevel--;
		if(NULL != e.lchild)
		{
			EnQueue(Q,*e.lchild);
			nextlevel ++;
		}
		if(NULL != e.rchild)
		{
			EnQueue(Q,*e.rchild);
			nextlevel++;
		}
		if(0 == curlevel)
		{
			levelcount++;
			printf("第%d层节点遍历结束!\n",levelcount);
			curlevel = nextlevel;
			nextlevel =0;
		}
	}
	return 1;
}



void CreateBiTree(BiTree &T)//先序创建二叉树
{
    char ch;
    cin>>ch;
    if(ch=='#') T=NULL;//使用#号表示左孩子或者右孩子为空为空
    else{
        T=new BiTNode;
        T->data=ch;//为结点赋值
        CreateBiTree(T->lchild);//使用递归为结点赋值
        CreateBiTree(T->rchild);
    }
}
void InOrderTraverse(BiTree T)//中序遍历输出
{
    if(T)
    {
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }
}
void PreOrderTraverse(BiTree T)//先序遍历输出
{
    if(T)
    {
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BiTree T)//后序遍历输出
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout<<T->data;
    }
}
int Depth(BiTree T)//树的深度
{
    if(T==NULL)
        return 0;
    else
    {
        int m=Depth(T->lchild);
        int n=Depth(T->rchild);
        if(m>n) return (m+1);//寻找最深的结点,如果左孩子走的最深,就返回左孩子最深的数值
        else return (n+1);//如果右孩子走的更深则返回右孩子最深的数值
    }
}
int NodeCount(BiTree T)//统计二叉树中结点的个数
{
    if(T==NULL) return 0;
    else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;//左孩子加右孩子,再加上根节点
}
int LeafCount(BiTree T)//统计二叉树中叶子结点的个数
{
    if(!T) return 0;
    if(!T->lchild &&!T->rchild){//如果二叉树左孩子和右孩子皆为空,说明该二叉树根节点为叶子节点,加1.
        return 1;
    }else{
        return LeafCount(T->lchild)+LeafCount(T->rchild);
    }
}
int Node_1_Count(BiTree T)//统计二叉树的度为1的结点个数
{
    if(!T) return 0;
    if((!T->lchild)&&(T->rchild)||(T->lchild)&&(!T->rchild))
        return 1 + Node_1_Count(T->lchild) + Node_1_Count(T->rchild);//只有左孩子或者右孩子为空的结点进行加一
    else
        return Node_1_Count(T->lchild) + Node_1_Count(T->rchild);
}



int main()
{
    BiTree T;
    //测试例子AB#CD##E##F#GH###
    //测试例子ABD##D##E##CF##G##
    cout<<"先序遍历输入(以#结束):";
    CreateBiTree(T);
    cout<<"中序遍历输出:";
    InOrderTraverse(T);
    cout<<endl<<"先序遍历输出:";
    PreOrderTraverse(T);
    cout<<endl<<"后序遍历输出:";
    PostOrderTraverse(T);
    cout<<endl<<"树的深度:"<<Depth(T);
    cout<<endl<<"结点的个数:"<<NodeCount(T);
    cout<<endl<<"叶结点的个数:"<<LeafCount(T);
    cout<<endl<<"度为1的结点个数:"<<Node_1_Count(T);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值