1. 程式人生 > >九度筆記之 1467:二叉排序樹

九度筆記之 1467:二叉排序樹

題目1467:二叉排序樹

時間限制:1 秒

記憶體限制:128 兆

特殊判題:

提交:1292

解決:518

題目描述:

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


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


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

輸入:

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

輸出:

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

樣例輸入:
5
2 5 1 3 4
樣例輸出:
-1
2
2
5
3

演算法分析

     考察二叉排序數的基本操作,插入過程相對簡單,value大於當前節點跳到右子樹,value小於當前節點跳到左子樹

       插入過程和查詢過程十分類似,不過在查詢中需要判斷當前節點是否等於value.

biNode* search(int value){
	biNode *y = NULL;
	biNode *x = root;
	while(x!=NULL){
		if(value > x->value){
			y = x;
			x = x->Left;
		}
		else{
			y = x;
			x = x->Right;
		}
	}
	return x;
}
         

     二叉排序數的其它操作參見 二叉排序數的總結

源程式

//============================================================================
// Name        : judo1467.cpp
// Author      : wdy
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
 
#include <iostream>
using namespace std;
struct biNode{
    int value;
    biNode *parent;
    biNode *Left;
    biNode *Right;
public:
    biNode(int value_):value(value_),parent(NULL),Left(NULL),Right(NULL){};
};
 
biNode *root = NULL;
void insert(int value){
    biNode *temnode = new biNode(value);
    if(root==NULL){
        root = temnode;
        std::cout<<-1<<std::endl;
        return;
    }
    biNode *y = NULL;
    biNode *x = root;
    while(x!=NULL){
        if(value > x->value){
            y = x;
            x = x->Left;
        }
        else{
            y = x;
            x = x->Right;
        }
    }
 
    if(value > y->value){
        y->Left = temnode;
    }else{
        y->Right = temnode;
    }
    std::cout<< y->value <<std::endl;
}
void init(int n){
    root = NULL;
    int value;
    for(int i = 0;i<n;i++){
        std::cin>>value;
        insert(value);
    }
}
void judo(){
    int n = 0;
    while(std::cin>>n){
        init(n);
    }
}
int main() {
    //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    judo();
    return 0;
}
 
/**************************************************************
    Problem: 1467
    User: KES
    Language: C++
    Result: Accepted
    Time:20 ms
    Memory:1520 kb
****************************************************************/