本題演算法的基本思路如下:
①對源序列建樹。
②對目標序列建樹。
③將isequ標誌置true。
④對源序列與目標序列分別先序遍歷,並引入兩個棧結構在遞迴遍歷時不斷壓入各自的遍歷序列。
⑤對兩個棧進行比對,若出現不同則isequ=false。
⑥使用相同的方法得到兩個中序遍歷序列並比對。
⑦輸出結果。
有如下收穫:
①判斷兩棵二叉樹是否相同,只要分別比對他們的先序和中序序列。包括中序在內的兩種遍歷結果可以唯一確定一棵二叉樹。
②在樹的遍歷中想要記錄下遍歷到的結點的data,使用陣列的話要輔以乙個游標記錄位置,並且此游標必須要在函式之外初始化,十分的麻煩。這時可以引入棧結構,每次遞迴呼叫只需壓棧即可。(佇列同理)
③二叉樹的一種很重要的實現方式:直接使用elem陣列而非struct結構體來表示二叉樹,用下標作為游標代替左右指標。i結點的左子樹下標即2i,右即2i+1。
此法的前提條件:二叉樹的密度必須大,即不能是稀疏樹。否則空間利用率將會極低,從而在處理層數較多的bst(如單支樹)時造成記憶體超載。
此法的優點(較之結構體實現方式):
1.免去了結點記憶體空間的申請、清理等,大大提公升了程式時空效率,減小了**量。
綜上,在條件允許的情況之下(最壞情況下不會造成記憶體過載),盡量使用此法,可以大大提公升效率,精簡**。判斷合適與否的方式:譬如此題,最多只有10個結點,最壞情況下共10層(單支樹),在陣列實現方式下需要2^10-1=1023大小的陣列,在可接受範圍之內。
題目描述:判斷兩序列是否為同一二叉搜尋樹序列
輸入:開始乙個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。
接下去一行是乙個序列,序列長度小於10,包含(0~9)的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。
接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜尋樹。
輸出:如果序列相同則輸出yes,否則輸出no
樣例輸入:
2567432
543267
576342
0
樣例輸出:
yesno
2023年浙江大學計算機及軟體工程研究生機試真題
答疑:
鏈式結構實現如下:
#include #include #include using namespace std;
typedef struct binode*bitree;
bitree createnode(int x);
bitree insertnode(bitree &t,int x);
void freetree(bitree &t);
void printtree(bitree t);
void preorder(bitree t,stack&seq);
void inorder(bitree t,stack&seq);
int main()
//n line comparing
for (int index=0;index>s;
//createtree u
for (int i=0;s[i]!='\0';i++)
//compare
//initiate stack
while (!seqt.empty())
while (!seqt.empty())
//preorder
preorder(t,seqt);
preorder(u,sequ);
while (!seqt.empty())
seqt.pop();
sequ.pop();
}//initiate stack
while (!seqt.empty())
while (!seqt.empty())
//inorder
if (isequ==true)
seqt.pop();
sequ.pop();}}
//cout
if (isequ==true)
cout<<"yes"rc=null;
t->data=x;
return t;
}bitree insertnode(bitree &t,int x)
else
}void freetree(bitree &t)
}void printtree(bitree t)
}void preorder(bitree t,stack&seq)
}void inorder(bitree t,stack&seq)
}
九度OJ 1009 二叉搜尋樹
題目描述 判斷兩序列是否為同一二叉搜尋樹序列 輸入 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這...
九度OJ 題目1009 二叉搜尋樹
題目描述 判斷兩序列是否為同一二叉搜尋樹序列 輸入 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這...
題目1009 二叉搜尋樹
題目1009 二叉搜尋樹 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 7634 解決 3374 題目描述 判斷兩序列是否為同一二叉搜尋樹序列 輸入 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒...