二叉树的建立与显示

#include<iostream>
#include<vector>

using namespace std;

struct BinaryTreeNode
{
	int value;
	BinaryTreeNode *left;
	BinaryTreeNode *right;
};

BinaryTreeNode *CreatBT();
void preorder(BinaryTreeNode *T);
void inorder(BinaryTreeNode *T);
void postorder(BinaryTreeNode *T);
void leafnum(BinaryTreeNode *T,int &count);
void Nodenum(BinaryTreeNode *T,int &count_total);
void ShowTree(BinaryTreeNode *T);

int main()
{
	BinaryTreeNode *T=NULL;
	int count=0,count_total=0,choice=0;
	do{
		cout<<endl;
		cout<<"二叉树"<<endl;
		cout<<"********************************************"<<endl;
		cout<<"* *"<<endl;
		cout<<"* 主菜单"<<endl;
		cout<<"* 1 建立二叉树"<<endl;
		cout<<"* 2 先序遍历二叉树"<<endl;
		cout<<"* 3 中序遍历二叉树"<<endl;
		cout<<"* 4 后序遍历二叉树"<<endl;
		cout<<"* 5 二叉树的叶子结点数"<<endl;
		cout<<"* 6 显示二叉树"<<endl;
		cout<<"* 7 二叉树的所有结点数"<<endl;
		cout<<"* 8 退出程序"<<endl;
		cout<<"********************************************"<<endl;
		cout<<" 请输入您的选择(1,2,3,4,5,6,7,8):"<<endl;
		cin>>choice;

		switch(choice)
		{
		case 1:
			cout<<"二叉树的建立,以输入0表示结束。"<<endl;
			cout<<"请输入根结点:"<<endl;
			count=count_total=0;
			T=CreatBT();
			cout<<"二叉树成功建立。"<<endl;
			break;
		case 2:
			cout<<"前序遍历二叉树:"<<endl;
			preorder(T);
			break;
		case 3:
			cout<<"中序遍历二叉树:"<<endl;
			inorder(T);
			break;
		case 4:
			cout<<"后序遍历二叉树:"<<endl;
			postorder(T);
			break;
		case 5:
			cout<<"二叉树的叶子结点数为:"<<endl;
			leafnum(T,count);
			cout<<count<<endl;
			break;
		case 6:
			ShowTree(T);
			break;
		case 7:
			cout<<"二叉树的所有结点数为:"<<endl;
			Nodenum(T,count_total);
			cout<<count_total<<endl;
			break;
		default:
			exit(0);
		}
	}while(choice<=8);
		
	system("pause");
	return 0;
}

/********************************************************************/
//建立二叉树
BinaryTreeNode *CreatBT()
{
	BinaryTreeNode *t=NULL;
	int x;
	cin>>x;
	if(x!=0)
	{
		t=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
		t->value=x;
		cout<<"请输入"<<t->value<<"结点的左子结点"<<endl;
		t->left=CreatBT();
		cout<<"请输入"<<t->value<<"结点的右子结点"<<endl;
		t->right=CreatBT();
	}
	return t;
}

/********************************************************************/
//前序遍历
void preorder(BinaryTreeNode *T)
{
	if(T==NULL)
		return;
	else
	{
		cout<<T->value<<" ";
		preorder(T->left);
		preorder(T->right);
	}
}

/********************************************************************/
//中序遍历
void inorder(BinaryTreeNode *T)
{
	if(T==NULL)
		return;
	else
	{
		inorder(T->left);
		cout<<T->value<<" ";
		inorder(T->right);
	}
}

/********************************************************************/
//后序遍历
void postorder(BinaryTreeNode *T)
{
	if(T==NULL)
		return;
	else
	{
		postorder(T->left);
		postorder(T->right);
		cout<<T->value<<" ";
	}
}

/********************************************************************/
//记录叶子结点数
void leafnum(BinaryTreeNode *T,int &count)
{
	if(T)
	{
		if(T->left==NULL && T->right==NULL)
			++count;
		leafnum(T->left,count);
		leafnum(T->right,count);
	}
}

/********************************************************************/
//显示二叉树
void ShowTree(BinaryTreeNode *T)
{
	BinaryTreeNode *stack[100];
	BinaryTreeNode *p;
	
	int level[100][2];
	int top,n,i;
	int width=4;
	
	if(T!=NULL)
	{
		cout<<"二叉树的表示法"<<endl;
		top=1;
		stack[top]=T;
		level[top][0]=width;
		while(top>0)
		{
			p=stack[top];
			n=level[top][0];
			for(i=1;i<=n;i++)
				cout<<" ";
			if(level[top][1]==2)
				cout<<"right";
			else if(level[top][1]==1)
				cout<<"left";
			else
				cout<<"root";
			cout<<p->value;
			for(int j=0;j!=60;j+=2)
				cout<<"*";
			cout<<endl;
			top--;
			if(p->right!=NULL) //栈中先压入右子树,这样才能先弹出左子树
			{
				top++;
				stack[top]=p->right;
				level[top][0]=n+width;
				level[top][1]=2;
			}
			if(p->left!=NULL)
			{
				top++;
				stack[top]=p->left;
				level[top][0]=n+width;
				level[top][1]=1;
			}
		}
	}
}

/********************************************************************/
//记录二叉树所有结点数
void Nodenum(BinaryTreeNode *T, int &count_total)
{
	if(T)
	{
		++count_total;
		Nodenum(T->left,count_total);
		Nodenum(T->right,count_total);
	}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值