1. 程式人生 > >題目1467:二叉排序樹 九度OJ

題目1467:二叉排序樹 九度OJ

題目1467:二叉排序樹

時間限制:1 秒

記憶體限制:128 兆

特殊判題:

提交:4745

解決:1953

題目描述:

        二叉排序樹,也稱為二叉查詢樹。可以是一顆空樹,也可以是一顆具有如下特性的非空二叉樹:


        1. 若左子樹非空,則左子樹上所有節點關鍵字值均不大於根節點的關鍵字值;
        2. 若右子樹非空,則右子樹上所有節點關鍵字值均不小於根節點的關鍵字值;
        3. 左、右子樹本身也是一顆二叉排序樹。


  現在給你N個關鍵字值各不相同的節點,要求你按順序插入一個初始為空樹的二叉排序樹中,每次插入後成功後,求相應的父親節點的關鍵字值,如果沒有父親節點,則輸出-1。

輸入:

輸入包含多組測試資料,每組測試資料兩行。
第一行,一個數字N(N<=100),表示待插入的節點數。
第二行,N個互不相同的正整數,表示要順序插入節點的關鍵字值,這些值不超過10^8。

輸出:

輸出共N行,每次插入節點後,該節點對應的父親節點的關鍵字值。

樣例輸入:
5
2 5 1 3 4
樣例輸出:
-1
2
2
5
3
來源:
#include <cstdio>
using namespace std;
struct Node{
	Node* lchild;
	Node* rchild;
	int c;
	int location;
}Tree[110];
int loc;
int fatherloc;
Node* creat(){
	Tree[loc].lchild=Tree[loc].rchild=NULL;
	Tree[loc].location=loc;
	return &Tree[loc++];
}

Node* insert(Node* T,int x){
	if(T==NULL){
		T=creat();
		T->c=x;
		if(T->location==0){
			printf("-1\n");
		}else{
			printf("%d\n",Tree[fatherloc].c);
		}
		return T; 
	}else if(x<T->c){
		fatherloc=T->location;	
		T->lchild=insert(T->lchild,x);
	}else if(x>T->c){
		fatherloc=T->location;		
		T->rchild=insert(T->rchild,x);

	}
	return T;
}

int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		Node* T=NULL;
		loc=0;
		for(int i=0;i<n;i++){
			int x;
			fatherloc=-1;
			scanf("%d",&x);
			T=insert(T,x);
		}
	}
	return 0;
}

利用二叉樹順序儲存的儲存方式,記錄父節點下標實現對父節點的訪問。