二叉链树的创建结点,递归构造二叉树、非递归构造二叉树、递归进行前、中、后遍历,非递归进行前中后遍历、层次遍历

二叉链树的创建结点,递归构造二叉树、非递归构造二叉树、递归进行前、中、后遍历,非递归进行前中后遍历、层次遍历

、求二叉树叶子结点的个数、求二叉树的总结点个数、求二叉树的深度、在二叉树上查询某个元素x是否和某个结点的值相等。

本代码用

递归进行二叉链树的构造、遍历和

非递归进行二叉链树的构造、遍历

二叉链表图示:

代码如下:

//二叉树的二叉链表示 
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<malloc.h>
#include<stack>    //栈的头文件 
#define DataType char
#define MAXSIZE 100
typedef struct Node{
	DataType data;
	struct Node *lchild,*rchild;
}BiTree;
void CreateBiTree(BiTree *&bt)  //递归构造二叉树 
{
	char ch;
	ch=getchar();
	if(ch=='.')
	bt=NULL;
	else
	{
		bt=(BiTree*)malloc(sizeof(BiTree));
		bt->data=ch;
		CreateBiTree((bt->lchild));
		CreateBiTree((bt->rchild));
	}
}
/*void CreateBiTree2(BiTree *&bi)  //非递归构造二叉树 
{
	BiTree *q[MAXSIZE];
	BiTree *s;
	char n;
	int i,j;
	cout<<"输入二叉树各个节点的编号和值:"<<endl;
	cin>>i>>n;
	while(i!=0&&n!='$')
	{
		s=(BiTree*)malloc(sizeof(BiTree));  //生成一个节点
		s->data=n;
		s->lchild=NULL;
		s->rchild=NULL;
		q[i]=s;
		if(i!=1)
		{
			j=i/2;
			if(i%2==0)
			q[j]->lchild=s;
			else 
			q[j]->rchild=s;
		 } 
		 cout<<"输入二叉树各个节点的编号和值:"<<endl;
		 cin>>i>>n;
	}
	bi=q[1];
}*/
void PreOrder(BiTree *bt)  //递归前序遍历二叉树 
{
	if(bt!=NULL)
	{
	printf("%c",bt->data);
	PreOrder(bt->lchild);
	PreOrder(bt->rchild);
	}
}
/*void PreOrder2(BiTree *bt)  //非递归前序遍历二叉树 
{
	stack<BiTree*> s;
	BiTree *p=bt;
	while(p!=NULL||!s.empty())
	{
		while(p!=NULL)
		{
			cout<<p->data;
			s.push(p);
			p=p->lchild;
		}
		if(!s.empty())
		{
			p=s.top();
			s.pop();
			p=p->rchild;
		}
	}
}*/ 
void InOrder(BiTree *bt)  //递归中序遍历二叉树 
{
	if(bt!=NULL)
	{
		InOrder(bt->lchild);
		printf("%c",bt->data);
		InOrder(bt->rchild);
	}
}
/*void InOrder2(BiTree *bt)  //非递归中序遍历二叉树 
{
	stack<BiTree*> s;
	BiTree *p=bt;
	while(p!=NULL||!s.empty())
	{
		while(p!=NULL)
		{
			s.push(p);
			p=p->lchild;
		}
		if(!s.empty())
		{
		p=s.top();
		s.pop();
		cout<<p->data;
		p=p->rchild;
		}
	}
}*/ 
void PostOrder(BiTree *bt)  //递归后序遍历二叉树 
{
	if(bt!=NULL)
	{
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		printf("%c",bt->data);
	}
}
/*void PostOrder2(BiTree *bt)  //非递归后序遍历二叉树 
{
	stack<BiTree*> s;
	BiTree *cur;     //当前结点 
	BiTree *pre=NULL;     //前一次访问的结点
	s.push(bt);
	while(!s.empty())
	{
		cur=s.top();
		if(cur->lchild==NULL&&cur->rchild==NULL||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
		{
			cout<<cur->data;  //如果当前结点没有孩子或者孩子结点都已经被访问过了
			s.pop();
			pre=cur; 
		}
		else
		{
			if(cur->rchild!=NULL)
			s.push(cur->rchild);
			if(cur->lchild!=NULL)
			s.push(cur->lchild);
		}
	}
}*/
void LeverOrder(BiTree *bt)  //层次遍历  用队列来进行层次遍历 
{
	BiTree *q[MAXSIZE],*p;    
	int front=0,rear=0;      //定义front、rear为队列的头和尾“指针” 
	if(bt!=NULL)             //二叉树不为空,根结点入队列 
	{
		rear=(rear+1)%MAXSIZE;
		q[rear]=bt;
	 }
	 while(front!=rear) 
	 {
	 	front=(front+1)%MAXSIZE;
	 	p=q[front];
	 	cout<<p->data;
	 	if(p->lchild!=NULL)
		{
			rear=(rear+1)%MAXSIZE;
			q[rear]=p->lchild; 
		 } 
		 if(p->rchild!=NULL)
		 {
		 	rear=(rear+1)%MAXSIZE;
		 	q[rear]=p->rchild;
		 }
	 }
}
void LeafNum(BiTree *bt,int &count)  //求树叶结点的个数 
{
	if(bt!=NULL)
	{
		if(bt->lchild==NULL&&bt->rchild==NULL)  //当结点为树叶的时候,count++ 
		count++;
		LeafNum(bt->lchild,count);
		LeafNum(bt->rchild,count);
	}
}
void NodeNum(BiTree *bt,int &count)  //求二叉树结点的总数 
{
	if(bt!=NULL)
	{
		count++;
		NodeNum(bt->lchild,count);
		NodeNum(bt->rchild,count);
	}
}
int BiTreeDepth(BiTree *bt)  //求二叉树的深度 
{ 
	int ldep,rdep;          //定义两个整型变量,用以存放左、右子树的深度 
	if(bt==NULL)            //若树为空则返回0 
	return 0;
	else
	{
		ldep=BiTreeDepth(bt->lchild);    //递归统计bt的左子树的深度 
		rdep=BiTreeDepth(bt->rchild);    //递归统计bt的右子树的深度 
		if(ldep>rdep)                    //返回深度最大的子树 
		return ldep+1;
		else
		return rdep+1;
	}
}
BiTree *Search(BiTree *bt,DataType x)
{
	if(bt->data==x) return bt;  //若查找根节点成功,即返回,否则分别在左右子树查找
	if(bt->lchild!=NULL) 
	return (Search(bt->lchild,x)); //在bt->lchild为根节点指针的二叉树中查找数据元素x
	if(bt->rchild!=NULL)
	return (Search(bt->rchild,x)); //在bt->rchild为根节点指针的二叉树中查找数据元素x
	return NULL;  //查找失败返回 
 } 
int main()
{
	BiTree *bt;        //采用递归 
	CreateBiTree(bt);
	
	cout<<endl<<"先序遍历为:"<<endl;
	PreOrder(bt);
	
	cout<<endl<<"中序遍历为:"<<endl;
	InOrder(bt);
	
	cout<<endl<<"后序遍历为:"<<endl;
	PostOrder(bt);
	
	cout<<endl<<"层次遍历为:"<<endl;
	LeverOrder(bt);
	
	int count=0;
	LeafNum(bt,count);
	cout<<endl<<"树叶结点数为:"<<count<<endl;
	
	count=0;
	NodeNum(bt,count);
	cout<<endl<<"二叉树结点总数为:"<<count<<endl;
	
	count=BiTreeDepth(bt);
	cout<<endl<<"二叉树的深度为:"<<count<<endl;
	
	BiTree *p;
	char x='a';
	p=Search(bt,x);
	cout<<p->data; 
/*	BiTree *bt;         //采用非递归 
	CreateBiTree2(bt);
	
	cout<<endl<<"先序遍历为:"<<endl;
	PreOrder(bt);
	
	cout<<endl<<"中序遍历为:"<<endl;
	InOrder(bt);
	
	cout<<endl<<"后序遍历为:"<<endl;
	PostOrder(bt);
	*/
	return 0; 
}


   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值