天梯賽 L2 004 這是二叉搜尋樹嗎 題解

2021-10-04 07:04:51 字數 2704 閱讀 5100

一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹:對於任一結點,

其左子樹中所有結點的鍵值小於該結點的鍵值;

其右子樹中所有結點的鍵值大於等於該結點的鍵值;

其左右子樹都是二叉搜尋樹。

所謂二叉搜尋樹的「映象」,即將所有結點的左右子樹對換位置後所得到的樹。

給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜尋樹或其映象進行前序遍歷的結果。

輸入格式:

輸入的第一行給出正整數 n(≤1000)。隨後一行給出 n 個整數鍵值,其間以空格分隔。

輸出格式:

如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出 yes ,然後在下一行輸出該樹後序遍歷的結果。數字間有 1 個空格,一行的首尾不得有多餘空格。若答案是否,則輸出 no。

輸入樣例 1: 7 8 6 5 7 10 8 11

輸出樣例 1: yes 5 7 6 8 11 10 8

輸入樣例 2: 7 8 10 11 8 6 7

輸出樣例 2: yes 11 8 10 7 5 6 8

輸入樣例 3: 7 8 6 8 5 10 9 11

輸出樣例 3: no

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include <

set>

#include

#include

using namespace std;

vectorans1;

class

node};

vectoraaaa;

//存答案用的

node *

createanode

(int dat)

class

searchtree

void

add(int d,node *p)

else

}else

else}}

void

addr

(int d,node *p)

else

}else

else}}

void

showf

(node *p)

void

showr

(node *p)};

int main()

if(list[1]

>=list[0]

)flip=1;

//檢查是否可能是映象

if(flip)

st.showf

(st.root)

;//並生成前序遍歷的結果

if(ans1!=list)

cout<<

"yes"

showr

(st.root)

;for

(int j =

0; j < aaaa.

size()

;++j)

}else

st.showf

(st.root);if

(ans1!=list)

cout<<

"yes"

showr

(st.root)

;for

(int j =

0; j < aaaa.

size()

;++j)

}return0;

}

這道題其實主要還是考的二叉搜尋樹的建立

對於一顆二叉搜尋樹而言,要新增節點就是遞迴比較節點值和該數字的值的大小,數字小於節點值則向左節點新增,大於等於則向右節點新增。如果需要新增的節點已經存在了子節點,則遞迴進入下一層。對於一棵二叉搜尋樹的映象,則是將插入規則調換(小於在右,大於等於在左邊)後生成的樹的結果。

說回題目,如果乙個序列是一棵樹的前序遍歷的結果,那麼必然的,按照這個前序遍歷所生成的樹的前序遍歷結果和原序列是一致的。

根據前序遍歷的規則我們可以知道,首先被遍歷的節點永遠是當前未遍歷的節點之中最靠左邊的左斜線的子樹中最靠近根節點的那個(因為不知道怎麼畫圖所以就不畫圖表示了)。前序遍歷的結果也自然也遵循這一規律(也就是說越靠左邊越靠近根節點則出現的順序則越靠前)。如果按照前序遍歷的序列去生成對應的二叉搜尋樹的話,當生成到任意節點時,此時其所有的前置節點(指該節點以上直到根節點的所有父節點)都已經對應生成完畢,再進行插入則可以將這個節點插入到先前的對應位置上。如此重複直到所有的值都被插入樹中即可得到原來完整的二叉搜尋樹

以上是針對現有的前序遍歷序列是正確的情況而討論的

如果不是正確的二叉搜尋樹所生成的前序遍歷結果,當遍歷到錯誤的前序遍歷值上時,就會因為不存在完整的前序節點鏈而導致該值插入到與原序列相異的位置上,最終導致生成的前序遍歷結果與原結果相異

對於映象的二叉搜尋樹以上結論同樣適用

所以要判斷乙個前序遍歷是不是正確的二叉搜尋樹所得出來的,只需要根據這個前序遍歷去生成二叉搜尋樹,再對生成的樹的前序遍歷結果和原前序遍歷結果進行比較即可得出其正確與否

天梯賽 L2 004 這是二叉搜尋樹嗎?

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是...

天梯賽 L2 004 這是二叉搜尋樹嗎?

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是...

L2 004 這是二叉搜尋樹嗎?

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...