L2 004 這是二叉搜尋樹嗎?

2021-07-28 12:43:50 字數 1808 閱讀 5790

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

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

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

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

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

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

輸入的第一行給出正整數n(<=1000)。隨後一行給出n個整數鍵值,其間以空格分隔。
如果輸入序列是對一棵二叉搜尋樹或其映象進行前序遍歷的結果,則首先在一行中輸出「yes」,然後在下一行輸出該樹後序遍歷的結果。數字間有1個空格,一行的首尾不得有多餘空格。若答案是否,則輸出「no」。
7

8 6 5 7 10 8 11

yes57

681110

8

直接按給定的數字建立二叉搜尋樹。

接著先序遍歷,看看是否與給定的陣列相同。

如果不相同,則進行映象判斷(就是先從右再左),進行先序遍歷,看看是否與給定陣列相同。

注意輸出的時候,如果映象相同,就輸出映象。

#include

#include

#include

#include

#include

#include

using

namespace

std;

int a[1001];

int n;

class node

node()

};class tree

bool isok;

void insert(int k)

void display() else else }}

bool isyes;

private:

int i;

void display(node* node)

if (node->data != a[i])

i++;

display(node->left);

display(node->right);

}void display2(node* node)

display2(node->left);

display2(node->right);

if(i != 0)

cout

<< node->data;

i++;

}void display3(node* node)

if (node->data != a[i])

i++;

display3(node->right);

display3(node->left);

}void display4(node* node)

display4(node->right);

display4(node->left);

if(i != 0)

cout

<< node->data;

i++;

}node* insert(node* node, int k)

if (k < node->data) else

return node;

}};int main()

tree->display();

return

0;}

L2 004 這是二叉搜尋樹嗎?

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

L2 004 這是二叉搜尋樹嗎?

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

L2 004 這是二叉搜尋樹嗎?

題目鏈結 題解 這道題目我能想到兩種做法,方法1 直接根據樹的前序遍歷來建樹 分兩種情況 在建樹的過程中,判斷是否滿足二叉搜尋樹的條件,如果不滿足設定標誌位。然後建樹完成以後,對樹進行dfs後序遍歷,這種方法很暴力,也很容易理解,但是 有點繁瑣。方法2 直接在前序遍歷的結果上進行dfs,分成兩個子樹...