題目1467:二叉排序樹 九度OJ
阿新 • • 發佈:2019-01-09
題目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; }
利用二叉樹順序儲存的儲存方式,記錄父節點下標實現對父節點的訪問。