【九度】题目1201:二叉排序树

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:6443

解决:2718

题目描述:

    输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。

输入:

    输入第一行包括一个整数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 
提示:

输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。


// 构造二叉排序树.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
struct Node
{ Node *lchild;
Node *rchild;
int c;
}Tree[110];
//需要注意的是,二叉树的定义本来就是以指针递归的形式建立的,
//所以我们在建立二叉树的时候,需要用二级指针来改变指针的指向。

//有些函数传入的参数是某个类型的指针地址,函数内部就可以改变这个值,
//调用函数后,你再读取参数地址中的值,就是被函数修改过的了
int loc;
Node* creat(){
	Tree[loc].rchild=Tree[loc].lchild=NULL;
	return &Tree[loc++];//先return再++;
}
void preorder(Node *T){ //使用的是二级指针 
	printf("%d",T->c);
	if(T->lchild!=NULL) preorder(T->lchild);
	if (T->rchild!=NULL) preorder(T->rchild);
}
void inorder(Node *T){

	if(T->lchild!=NULL) inorder(T->lchild);
	printf("%d",T->c);
	if (T->rchild!=NULL) inorder(T->rchild);
}
void postorder(Node *T){

	if(T->lchild!=NULL) postorder(T->lchild);
	if (T->rchild!=NULL) postorder(T->rchild);
	printf("%d",T->c);
}

Node *Insert(Node *T, int x){

	if(T==NULL){
		T=creat();
		T->c=x;
		return T;
	}
	else if(xc) T->lchild=Insert(T->lchild,x);
	else if(x>T->c) T->rchild=Insert(T->rchild,x);
	return T;
}

int _tmain(int argc, _TCHAR* argv[])
{ int n;
while(scanf("%d",&n)){
	loc=0;
	Node *T=NULL;//声明了一个Node类型的指针。
	for (int i = 0; i < n; i++)
	{int x;
	scanf("%d",&x);
	T=Insert(T,x);//这里T表示的就是指针。声明的时候需要加*,实际使用的时候只用形参
	}
	preorder(T);
	printf("\n");
	inorder(T);
	printf("\n");
	postorder(T);
	printf("\n");

	}
return 0;
}




 关于对于建立二叉树的时候,对于指针使用的理解:

typedef struct BiTNode
{
       TElemType data;
       struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

void CreateBiTree(BiTree* T)                   //传入的是指向指针的指针
{
        TElemType ch;
        scanf("%c",&ch);
        if(ch == #')
        {
              *T = NULL;
        }
        else
        {
              *T = (BiTree )malloc( sizeof(BiTNode));
              (*T)->data = ch;
              CreateBiTree(&(*T)->lchild);
              CreateBiTree(&(*T)->rchild);
        }
}
需要在函数中改变指针的值,也就是对指针进行重新赋值,并且这个副作用需要影响到实参 这就需要用二级指针进行操作,也就是上一篇中说到的,
//有些函数传入的参数是某个类型的指针地址,函数内部就可以改变这个值,
//调用函数后,你再读取参数地址中的值,就是被函数修改过的了。
如果你需要在函数中修改指针的值,而不是指针指向的元素的值,那么这个指针对于你来说就是一个元素,你在函数中获得的这个指针是原来指针的副本,只是指向同一个地址,所以你可以借助这个副本指针去修改实参中的值,但是你直接修改指针的值(改变指针指向的地址)是无法对实参产生影响的,因为他只是个副本指针。

我需要修改二叉树中指针的指向,如果直接带入指针,那么只是原来指针的一个副本(即形参),只是指向同一个元素的关系,当该副本(形参)的值改变的时候,原来的指向的元素并没有改变,并且,当形参释放后,内存空间并没有释放,造成了内存泄漏的问题。

具体分析有篇文章说的很清楚,还需要再去看书理解:

http://blog.chinaunix.net/uid-26983585-id-3219788.html

你可能感兴趣的:(【九度】题目1201:二叉排序树)