二叉排序樹
時間限制:1 秒
記憶體限制:128 兆
特殊判題:否
提交:3829
解決:1540
- 題目描述:
-
二叉排序樹,也稱為二叉查詢樹。可以是一顆空樹,也可以是一顆具有如下特性的非空二叉樹:
1. 若左子樹非空,則左子樹上所有節點關鍵字值均不大於根節點的關鍵字值; 2. 若右子樹非空,則右子樹上所有節點關鍵字值均不小於根節點的關鍵字值; 3. 左、右子樹本身也是一顆二叉排序樹。
現在給你N個關鍵字值各不相同的節點,要求你按順序插入一個初始為空樹的二叉排序樹中,每次插入後成功後,求相應的父親節點的關鍵字值,如果沒有父親節點,則輸出-1。
- 輸入:
-
輸入包含多組測試資料,每組測試資料兩行。 第一行,一個數字N(N<=100),表示待插入的節點數。 第二行,N個互不相同的正整數,表示要順序插入節點的關鍵字值,這些值不超過10^8。
- 輸出:
-
輸出共N行,每次插入節點後,該節點對應的父親節點的關鍵字值。
- 樣例輸入:
-
5 2 5 1 3 4
- 樣例輸出:
-
-1 2 2 5 3
不多說;
程式碼:#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; typedef struct Node{ Node *l, *r; int v; Node(){ l = NULL; r = NULL; } }*tree, Node; void insert(Node* &p, int v, int pre){ if(p == NULL){ p = new Node(); p->v = v; printf("%d\n", pre); return; } if(v < p->v)insert(p->l, v, p->v); else insert(p->r, v, p->v); } int main(){ int N; while(~scanf("%d", &N)){ tree p; p = NULL; int v; for(int i = 0; i < N; i++){ scanf("%d", &v); insert(p, v, -1); } } return 0; }