題目鏈結
題解:這道題目我能想到兩種做法,
方法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 作者 陳越 一棵二叉搜尋樹可被遞迴地定義為具有下列性質的二叉樹 對於任一結點,所謂二叉搜尋樹的 映象 即將所有結點的左右子樹對換位置後所得到的樹。給定乙個整數鍵值序列,現請你編寫程式,判斷這是否...