PTAタイトルセットのデータ構造とアルゴリズム(中国)7-31
7-31デカルトツリー(25点)
デカルトツリーは、ノードは二つのキーワードK1とK2が含まれている特殊なバイナリツリー、です。まず、デカルト木はK1バイナリ検索ツリーについてです、すべてのK1値の左部分木で、そのノードがノードK1の値よりも小さい、右の子は大きいです。二次すべてのノードK2キーワード、すなわちプライオリティキュー(最小ヒープを設定することを望むかもしれない)の要件を満たす、K2の値は、すべてのノードのサブツリーK2値のノードよりも小さくなっています。バイナリツリーを考えると、ツリーデカルト木かどうかを確認してください。
入力フォーマット:
まず、入力の正の整数N(≤1000)、ツリー内のノードの数。ノードのK1値、K2の値、左の子ノード番号、右の子ノード番号:次いで、N行は、各ノードが含むメッセージを、与えられています。ノード0から提供される(N-1)オーダー〜数。ノードの子ノードが存在しない場合は、場所が与えられています- 。
出力フォーマット:
出力YES
ツリーは、デカルト木である場合は、それ以外の場合は出力NO
。
サンプル入力1:
6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 21 -1 4
15 22 -1 -1
5 35 -1 -1
出力サンプル1:
YES
サンプル入力2:
6
8 27 5 1 9 40 -1 -1 10 20 0 3 12 11 -1 4 15 22 -1 -1 50 35 -1 -1
出力サンプル2:
NO
トピック分析は:主に単語の問題のツリーは、各サブツリーは、我々はバランスの取れたバイナリツリープライオリティキューの定義と理解(最小ヒープ)バランスの取れたバイナリ判断の定義を満たす必要がある右の全体的な大きな木よりも左より小さい満たすためだけでなく、注意を払うことですバランスの取れたバイナリツリーの概念
1 の#define _CRT_SECURE_NO_WARNINGS 2の#include <stdio.hの> 3の#include < 文字列・H> 4の#include < malloc関数 .H> 5 6 構造体のTreeNode 7 { 8 int型K1。 9 int型K2; 10 INT Lcは、 11 INT Rcは、 12 } T R [ 1000年]。 13 14 INT収集[ 1000年]。 15 16 INT FindTree(INT N) 17 { 18 のために(int型 i = 0 ; iがN <、iは++ ) 19 であれば(!収集[I]) 20 リターンI。 21 } 22 23 24 25 int型 IsAVL(INT ツリー) 26 { 27 であれば(ツリー== - 1 ) 28 リターン 1 。 29 他の 30 { 31 であれば(TR [ツリー]を得た。LC = - !1!&& T R [ツリー] .RC = - 1 ) 32 もし(TR [ツリー] .K1> = T R [T R [ツリー]を得た。LC] .K1 && T R [ツリー] .K1 < T R [T R [ツリー] .RC] .K1) 33 リターン IsAVL(TR [ツリー]。 LC)&& IsAVL(TR [ツリー] .RC)。 34 他の 35 の戻り 0 ; 36 他の 場合(TR [ツリー]を得た。LC == - 1 && T R [ツリー] .RC == - 1 ) 37 リターン 1 。 38 他の 場合(TR [ツリー]を得た。LC == - 1 ) 39 リターン T R [ツリー] .K1 < T R [T R [ツリー] .RC] .K1。 40 他の 41 のリターン Trの[ツリー] .K1> =Trの[Trの[ツリー]を得た。LC] .K1。 42 43 } 44 } 45 46 INT IsMinHeap(INT ツリー) 47 { 48 であれば(ツリー== - 1 ) 49 リターン 1 。 50 他の 51 { 52 であれば(TR [ツリー]を得た。LC = - !1 && T R [ツリー] .RC =! - 1 ) 53 であれば(TR [ツリー] .K2 <= T R [T R [ツリー]を得た。LC]。 K2 && T R [ツリー] .K2 <= T R [T R [ツリー] .RC] .K2) 54 リターン IsMinHeap(TR [ツリー]を得た。LC)&& IsMinHeap(TR [ツリー] .RC)。 55 他の 56 の戻り 0 ; 57 他の 場合(TR [ツリー]を得た。LC == - 1 && T R [ツリー] .RC == - 1 ) 58 リターン 1 。 59 他の 場合(TR [ツリー]を得た。LC == - 1 ) 60 リターン T R [ツリー] .K2 <= T R [T R [ツリー] .RC] .K2。 61 他 62 リターン T R [ツリー] .K2 <= T R [T R [ツリー]を得た。LC] .K2。 63 } 64 } 65 INT JudgetLeft(INTツリー、INT T)。 66 int型 JudgetRight(int型の木、int型のT); 67 68 INT JudgetLeft(int型ツリー、INT T) 69 { 70 であれば(T == - 1つの ||ツリー== - 1 ) 71 リターン 1 。 72 であれば(TR [ツリー] .K1> T R [T] .K1) 73 リターン JudgetLeft(木、T R [T]を得た。LC)&& JudgetLeft(木、T R [T] .RC)。 74 他の 75 の戻り 0 ; 76 } 77 78 INTJudgetRight(int型ツリー、INT T) 79 { 80 であれば(T == - 1つの ||ツリー== - 1 ) 81 リターン 1 。 82 であれば(TR [ツリー] .K1 < T R [T] .K1) 83 リターン JudgetRight(木、T R [T]を得た。LC)&& JudgetRight(木、T R [T] .RC)。 84 他の 85 の戻り 0 ; 86 } 87 88 INT IsTree(INT ツリー) 89 { 90 であれば(ツリー== - 1) 91 リターン 1 。 92 であれば(JudgetLeft(木、T R [ツリー]を得た。LC)&& JudgetRight(木、T R [ツリー] .RC)) 93 リターン IsTree(TR [ツリー]を得た。LC)&& IsTree(TR [ツリー] .RC)。 94 他の 95 の戻り 0 ; 96 } 97 98 のint main()の 99 { 100 INT N。 101 のscanf(" %dの"、&N)。 102 のための(int型 iは= 0 ; iがNを<; Iは++ ) 103 { 104 INT K1、K2、LC、Rcを、 105 のscanf(" %D%D%D%D "、およびK1、およびK2、&LC、&RC)。 106 T R [I] .K1 = K1。 107 T R [I] .K2 = K2。 108 T R [i]を得た。LC = Lcと; 109 T R [i]は.RC = Rcと; 110 であれば(Lcが=! - 1 ) 111 収集[Lcは] = 1 。 112 であれば(RC =! - 1 ) 113は、 収集[RC] = 1 。 114 } 115 INTツリー= FindTree(N)。 116 であれば(IsAVL(ツリー)&& IsMinHeap(ツリー)&& IsTree(木)) 117 のprintf(" YES " )。 118 そう 119 のprintf(" NO " )。 120 戻り 0 ; 121 }