二叉树



.h文件:

/*二叉树独立结点的链式存储*/

typedef char ElemType;

struct BTreeNode
{
	ElemType data;
	BTreeNode *left;
	BTreeNode *right;
	BTreeNode *parent;
};

//初始化二叉树
void InitBTree(BTreeNode* &BT)
{
	BT = NULL;
}

//建立二叉树
void CreateBTree(BTreeNode* &BT, char *a)
{
	BTreeNode *s[10];
	int top = -1;
	BT = NULL;
	BTreeNode *p;
	int k;
	istrstream ins(a);
	char ch;
	ins>>ch;
	while(ch != '@')
	{
		switch(ch)
		{
			case '(':
				s[++top] = p;
				k = 1;
				break;
			case ')':
				top--;
				break;
			case ',':
				k = 2;
				break;
			default:
				p = new BTreeNode;
				p->data = ch;
				p->left = p->right = NULL;
				if(BT == NULL)
					BT = p;
				else
				{
					if(k == 1)
						s[top]->left = p;
					else if(k == 2)
						s[top]->right = p;
				}
				break;
		}
		ins>>ch;
	}
}

//检查二叉树是否为空
int BTreeEmpty(BTreeNode* &BT)
{
	return (BT == NULL);
}

/*遍历二叉树*/
//前序遍历
void PreOrder(BTreeNode* BT)
{
	if(BT != NULL)
	{
		cout<<BT->data<<" ";
		PreOrder(BT->left);
		PreOrder(BT->right);
	}
}

//中序便利
void InOrder(BTreeNode* BT)
{
	if(BT != NULL)
	{
		InOrder(BT->left);
		cout<<BT->data<<" ";
		InOrder(BT->right);
	}
}

//后序遍历
void PostOrder(BTreeNode* BT)
{
	if(BT != NULL)
	{
		PostOrder(BT->left);
		PostOrder(BT->right);
		cout<<BT->data<<" ";
	}
}

//按层遍历(非递归)
void LevelOrder(BTreeNode *BT)
{
	BTreeNode *q[30],*p;
	int front = 0,rear = 0;
	if(BT != NULL)
	{
		rear = (rear + 1) % 30;
		q[rear] = BT;
	}
	while(front != rear)
	{
		front = (front + 1) % 10;
		p = q[front];
		cout<<p->data<<" ";
		if(p->left != NULL)
		{
			rear = (rear + 1) % 10;
			q[rear] = p->left;
		}
		if(p->right != NULL)
		{
			rear = (rear + 1) % 10;
			q[rear] = p->right;
		}
	}
}


//求二叉树深度
int BTreeDepth(BTreeNode *BT)
{
	if(BT == NULL)
		return 0;
	int dep_left = BTreeDepth(BT->left);
	int dep_right = BTreeDepth(BT->right);
	if(dep_left > dep_right)
		return dep_left+1;
	return dep_right+1;
}

//输出二叉树,可在前序遍历的基础上做适当修改
void PrintBTree(BTreeNode *BT)
{
	if(BT != NULL)
	{
		cout<<BT->data;
		if(BT->left != NULL || BT->right != NULL)
		{
			cout<<"(";
			PrintBTree(BT->left);
			if(BT->right != NULL)
				cout<<",";
			PrintBTree(BT->right);
			cout<<")";
		}
	}
}

/*清除二叉树*/
//删除二叉树的所有结点
void DeleteBTree(BTreeNode *BT)
{
	if(BT != NULL)
	{
		DeleteBTree(BT->left);
		DeleteBTree(BT->right);
		delete BT;
	}
}
//清除一棵二叉树
void ClearBTree(BTreeNode* &BT)
{
	DeleteBTree(BT);
	BT = NULL;
}


.cpp文件:

#include <iostream>
#include <strstream>

using namespace std;

#include "BTree.h"

int main()
{
	BTreeNode *bt;
	InitBTree(bt);
	char b[50];
	cout<<"输入以'@'字符作为结束符的二叉树广义表表示:"<<endl;
	cin.getline(b,sizeof(b));
	CreateBTree(bt,b);
	PrintBTree(bt);
	cout<<endl<<"前序:";
	PreOrder(bt);
	cout<<endl<<"中序:";
	InOrder(bt);
	cout<<endl<<"后序:";
	PostOrder(bt);
	cout<<endl<<"按层:";
	LevelOrder(bt);
	cout<<endl<<"二叉树的深度为:";
	cout<<BTreeDepth(bt)<<endl;
	ClearBTree(bt);
	return 0;
}

//输入  A(B(C,D),E(,F(G)))@



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值