L2 004 這是二叉搜尋樹嗎?

2021-07-29 07:11:36 字數 2744 閱讀 5116

題目鏈結

題解:這道題目我能想到兩種做法,

方法1:直接根據樹的前序遍歷來建樹(分兩種情況)在建樹的過程中,判斷是否滿足二叉搜尋樹的條件,如果不滿足設定標誌位。

然後建樹完成以後,對樹進行dfs後序遍歷,這種方法很暴力,也很容易理解,但是**有點繁瑣。

方法2:直接在前序遍歷的結果上進行dfs,分成兩個子樹進行dfs,在dfs的過程中,記錄得到左子樹的最大最小值,和右子樹的最大最小值

在非映象的情況下,保證左子樹的最大值小於根節點,右子樹的最小值大於等於根節點。然後再得到根節點樹的最大最小值。

其中根節點樹的最大值是max(根節點值,右子樹的最大值)

根節點樹的最小值是min(根節點值,左子樹的最小值)

並且在dfs函式的最後將根節點壓入佇列裡面,輸出的時候直接按佇列順序輸出就可以了,是不是很巧妙。

在映象的情況下,類似。

貼**:

//方法1:直接建樹,暴力dfs
#include #include using namespace std;

const int maxn = 1005;

int t[maxn];

int left[maxn];

int right[maxn];

int val[maxn];

int n;

int flag = 0;

void readtree()

}int check()//檢查是否為鏡面翻轉或者是合不合法

int dfs(int u)

else

printf("%d",t[u]);

}int buildtree1(int l,int r,bool &sta)

int root = l;

int p = l+1;

while(p <= r&&t[p] < t[l])

for(int i = l+1;i <= p-1;i++)

}for(int i = p;i <= r;i++)

}left[root] = buildtree1(l+1,p-1,sta);

right[root] = buildtree1(p,r,sta);

return root;

}int buildtree2(int l,int r,bool &sta)

int root = l;

int p = l+1;

while(p <= r&&t[p] >= t[l])

int flag = 1;

for(int i = l+1;i <= p-1;i++)

}if(!flag)

flag = 1;

for(int i = p;i <= r;i++)

}if(!flag)

left[root] = buildtree2(l+1,p-1,sta);

right[root] = buildtree2(p,r,sta);

return root;

}int main()

else

else

}}

方法2:

#include #include #include using namespace std;

const int inf = 1e9;

int n;

queueq;

bool check1(int a,int l,int r,int& mn,int& mi)//非映象

int i;

for(i = l+1;i < r;i++)

if(a[i] > a[l]) break;

int tmn,tmi,ttmn,ttmi;

if(!check1(a,l+1,i,tmn,tmi))

return false;

else

if(!check1(a,i,r,ttmn,ttmi))

return false;

else

mn = max(ttmn,a[l]);

mi = min(tmi,a[l]);

q.push(a[l]);

return true;

}bool check2(int a,int l,int r,int& mn,int& mi)//映象

int i;

for(i = l+1;i < r;i++)

if(a[i] < a[l]) break;

int tmn,tmi,ttmn,ttmi;

if(!check2(a,l+1,i,tmn,tmi))

return false;

else

if(!check2(a,i,r,ttmn,ttmi))

return false;

else

mn = max(tmn,a[l]);

mi = min(ttmi,a[l]);

q.push(a[l]);

return true;

}int arr[1005];

int main()

return 0;

} while(!q.empty()) q.pop();

if(check2(arr,0,n,mn,mi))

return 0;

} puts("no");

return 0;}/*

78 6 5 7 10 8 11

78 10 11 9 6 7 5

*/

L2 004 這是二叉搜尋樹嗎?

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

L2 004 這是二叉搜尋樹嗎?

一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,其左子樹中所有結點的鍵值小於該結點的鍵值 其右子樹中所有結點的鍵值大於等於該結點的鍵值 其左右子樹都是二叉搜尋樹。所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否是對...

L2 004 這是二叉搜尋樹嗎?

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