題目描述
對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。
現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,如果是,則輸出對應二叉樹的後序遍歷序列。
輸入的第一行包含乙個正整數n(≤1000),第二行包含n個整數,為給出的整數鍵值序列,數字間以空格分隔。
輸出的第一行首先給出判斷結果,如果輸入的序列是某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍歷序列,則輸出yes,否側輸出no。如果判斷結果是yes,下一行輸出對應二叉樹的後序遍歷序列。數字間以空格分隔,但行尾不能有多餘的空格。
7
8 6 5 7 10 8 11
yes
5 7 6 8 11 10 8
7
8 6 8 5 10 9 11
no
分析
首先我們要根據輸入的序列建立搜尋樹,之後對搜尋樹進行一次前序遍歷。
對前序遍歷生成的陣列與原陣列進行比對,不同則進行映象變換。完全相同輸出yes,然後後序遍歷,輸出遍歷的陣列。
映象變換後進行前序遍歷,如果與原陣列不同,則輸出no。相同輸出yes,則進行後序遍歷,輸出遍歷的陣列。
c++ **
#includeusing namespace std;
const int n = 1e3+10;
int n,num[n],temp[n],idx;
struct node
};node* root;
node* insert(node* root,int u) //插入節點建立搜尋樹
bool f1;
void pre(node *root) //樹的前序遍歷
void post(node *root) //樹的後序遍歷
node* mirror(node *root) //對樹進行映象操作
int main()
pre(root); //通過前序遍歷建立temp
for(int i=1;i<=n;i++)
if(!f1)
}return 0;
}
7 28 搜尋樹判斷
7 28 搜尋樹判斷 25 分 對於二叉搜尋樹,我們規定任一結點的左子樹僅包含嚴格小於該結點的鍵值,而其右子樹包含大於或等於該結點的鍵值。如果我們交換每個節點的左子樹和右子樹,得到的樹叫做映象二叉搜尋樹。現在我們給出乙個整數鍵值序列,請編寫程式判斷該序列是否為某棵二叉搜尋樹或某映象二叉搜尋樹的前序遍...
判斷二叉搜尋樹
二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。判斷某棵樹是否為二...
判斷二叉搜尋樹
判斷是否為二叉搜尋樹有兩種方法 1.遞迴 val表示值 left是左子樹 right是右子樹 lower 下界 比最小值還小 upper 上界 比最大值還大 class solution bool isvalidbst treenode root 2.中序遍歷 由二叉搜尋樹的性質,中序遍歷序列是遞增...