机试算法讲解: 第17题 向着炮火前进:二叉排序树咋整啊?

/*
问题:输入一系列整数,建立二叉排序树,并进行前序,中序,后续遍历
输入:第一行为一个整数n(1<=n<=100),接下来一行包括n个整数
输出:对于数据建立二叉排序树,对二叉排序树进行前序、中序和后续遍历。每种遍历结果输出一行,每行最后一个数据之后又一个空格
输入:
5
1 6 5 9 8
输出:
1 6 5 9 8
1 5 6 8 9
5 8 9 6 1

关键:二叉排序树根节点为空
1 起始插入的根节点为空 root = insertNode(root,iValue)
2 在建立排序二叉树时,建立根节点采用判空方式,利用createNode()建立,建立时不仅左右子节点为空,并且返回当前节点指针之前时,计数器加1
*/
#include <stdio.h>
#include <string.h>

typedef struct Node
{
	Node* lchild;
	Node* rchild;
	int iData;
}Node;
Node Tree[100];

int loc = 0;

Node* createNode()
{
	Tree[loc].rchild = Tree[loc].lchild = NULL;
	return &Tree[loc++];
}

//前序遍历
void frontOrder(Node* T)
{
	printf("%d ",T->iData);
	if(T->lchild!=NULL)
	{
		frontOrder(T->lchild);
	}
	if(T->rchild!=NULL)
	{
		frontOrder(T->rchild);
	}
}

//中序遍历
void inOrder(Node* T)
{
	if(T->lchild!=NULL)
	{
		inOrder(T->lchild);
	}
	printf("%d ",T->iData);
	if(T->rchild!=NULL)
	{
		inOrder(T->rchild);
	}
}


//后序遍历
void backOrder(Node* T)
{
	if(T->lchild!=NULL)
	{
		backOrder(T->lchild);
	}
	if(T->rchild!=NULL)
	{
		backOrder(T->rchild);
	}
	printf("%d ",T->iData);
}

//关键是建立二叉排序树,返回值是建立的二叉树的指针
/*
void buildBiSortTree()
{
}
*/

Node* insertNode(Node* T,int x)
{
	//如果是空树,则建立节点
	if(NULL==T)
	{
		T = createNode();
		T->iData = x;
		return T;//一定要返回建立的节点
	}
	//若x大于根节点数值,插入到右节点上
	else if(T->iData < x)
	{
		T->rchild = insertNode(T->rchild,x);
	}
	else if(x < T->iData)
	{
		T->lchild = insertNode(T->lchild,x);
	}
	return T;
}



int main(int argc,char* argv[])
{
	int iNum;
	while(EOF!=scanf("%d",&iNum))
	{
		int iValue;
		Node* root = NULL;
		for(int i = 0 ; i < iNum ; i++)
		{
			scanf("%d",&iValue);
			//Node* T = insertNode(T,iValue);//关键,将其本身插入到节点只呢个
			//Node* T = insertNode(T,iValue);//二叉排序树根节点为空
			root = insertNode(root,iValue);
		}
		//进行前序,中序,后序遍历
		frontOrder(root);
		printf("\n");
		inOrder(root);
		printf("\n");
		backOrder(root);
		printf("\n");
	}
	getchar();
	return 0;
}

你可能感兴趣的:(二叉排序树,机试算法,建立二叉排序树)