顺序表实现二叉树的三种遍历


#include<iostream>

using namespace std;
#define BinTreeNode int

struct seqBinTree {
	int MAXNUM;
	int n;
	char *nodes;
};

typedef struct seqBinTree *PSQBinTree;

PSQBinTree createEmptyBinTree(int num);
int constructBinTree(PSQBinTree t, char * elemList);
int isNULL(PSQBinTree t);
BinTreeNode root(PSQBinTree t, BinTreeNode i);
BinTreeNode parent(PSQBinTree t, BinTreeNode c);
BinTreeNode leftChild(PSQBinTree t, BinTreeNode p);
BinTreeNode rightChild(PSQBinTree t, BinTreeNode p);
int print(PSQBinTree t);
void preOrder(PSQBinTree t, int i);                       //前序
void inOrder(PSQBinTree t, int i);                        //中序
void postOrder(PSQBinTree t, int i);                      //后序
int visit(PSQBinTree t, BinTreeNode p);
int destroyBinTree(PSQBinTree t);

PSQBinTree createEmptyBinTree(int num)                    //创建空二叉树
{
	PSQBinTree t = new seqBinTree;
	if(t != NULL)
	{
		t->nodes = new char[num];
		t->n = 0;
		t->MAXNUM = num;
		return t;
	}
	cout<<"Out of space"<<endl;
	return NULL;
};
 
int constructBinTree(PSQBinTree t, char * elemList)     //构造二叉树
{
	if((strlen(elemList)) <= t->MAXNUM)
	{
		for(int i = 0; i < strlen(elemList); i++)
		{
			t->nodes[i] = elemList[i];
			t->n++;
		}
		return 1;
	}
	cout<<"Out Space"<<endl;
	return 0;
};

int isNULL(PSQBinTree t)                             //判断是否为空
{
	if(t->n == 0)
		return 1;
	else
		return 0;
};

BinTreeNode root(PSQBinTree t, BinTreeNode i)  
{
	return i;
};

BinTreeNode parent(PSQBinTree t, BinTreeNode c)    //返回下标c结点的父结点的下标
{
	if(c <= 0 || c >= t->n)
		return -1;
	return (c - 1) / 2;
};

BinTreeNode leftChild(PSQBinTree t, BinTreeNode p)  //返回下标C的结点的左子结点的下标
{
	if(p < 0 || p > t->n)
		return -1;
	return 2*p + 1;
};

BinTreeNode rightChild(PSQBinTree t, BinTreeNode p) //返回下标C的结点的右子结点的下标
{
	if(p < 0 || p > t->n)
		return-1;
	return 2 * (p+1);
}

int print(PSQBinTree t)                            //输出二叉树所有元素以及关系
{
	cout<<"二叉树所有元素:";
	for(int i = 0; i < t->n; i++)
	{
		if(t->nodes[i] != '#')
			cout<<t->nodes[i]<<" ";
	}
	cout<<endl;
	for(int j = 0; j < t->n; j++)
	{
		if(t->nodes[j] != '#')
		{
			cout<<t->nodes[j]<<":";
			if(parent(t, j) != -1)
			{
				cout<<"父结点:"<<t->nodes[parent(t, j)]<<"  ";
			}
			if(leftChild(t, j) != -1 && t->nodes[leftChild(t, j)] != '#')
			{
				cout<<"左子结点:"<<t->nodes[leftChild(t, j)]<<"  ";
			}
			if(rightChild(t, j) != -1 && t->nodes[rightChild(t, j)] != '#')
			{
				cout<<"右子结点:"<<t->nodes[rightChild(t, j)]<<"  ";
			}
			cout<<endl;
		}
	}
	return 1;
};

void inOrder(PSQBinTree t, int i)              //中根遍历
{
	if(t->nodes[i] == '#')
		return ;
	inOrder(t, leftChild(t, i));
	visit(t, root(t, i));
	inOrder(t, rightChild(t, i));
};

void postOrder(PSQBinTree t, int i)             //后根遍历
{
	if(t->nodes[i] == '#')
		return ;
	postOrder(t, leftChild(t, i));
	postOrder(t, rightChild(t, i));
	visit(t, root(t, i));
};

void preOrder(PSQBinTree t, int i)               //先根遍历
{
	if(t->nodes[i] == '#')
		return ;
	visit(t, root(t, i));
	preOrder(t, leftChild(t, i));
	preOrder(t, rightChild(t, i));
};



int visit(PSQBinTree t, BinTreeNode p)
{
	cout<<t->nodes[p]<<" ";
	return t->nodes[p];
};

int destroyBinTree(PSQBinTree t)                     //销毁二叉树
{
	delete(t->nodes);
	delete(t);
	return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char ch[32] = "ABCD#EF#####GHI################";  //定义二叉树
	PSQBinTree t = createEmptyBinTree(31);            
	constructBinTree(t, ch);
	print(t);
	cout<<"\n\n";
	cout<<"中根遍历:";                           //中根遍历
	inOrder(t, 0);
	cout<<endl;
	cout<<"后根遍历:";                           //后根遍历
	postOrder(t, 0);
	cout<<endl;
	cout<<"先根遍历:";                           //先根遍历
	preOrder(t, 0);
	cout<<endl;


	destroyBinTree(t);                            //销毁二叉树
	return 0;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值