04-樹4 是否同一棵二叉搜索樹
阿新 • • 發佈:2017-12-07
思路 http clas name same std 分享圖片 res space
題目
輸入樣例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
輸出樣例:
Yes
No
No
基本思路
先根據第一行的輸入建一棵二叉搜索樹,每個結點設一個flag表示該結點是否被訪問過。判斷之後的輸入時,對每個元素進行查找,入找到前碰到未訪問過的元素或者找不到,說明不是同一棵二叉搜索樹。
代碼
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct Node* link; struct Node { int val; link left; link right; int flag; //訪問過為1,否則為0 }; link insert(link T, int val); int check(link T, int val); void freeTree(link T); void resetFlag(link T); int main() { while (1) { int N, L,same=1; scanf("%d", &N); //插入元素個數 if (N == 0) break; scanf("%d", &L); //檢查序列個數 //根據第一行建樹 link headpos=NULL; int temp; scanf("%d", &temp); headpos = insert(headpos, temp); for (int i = 1; i < N; i++) { scanf("%d", &temp); insert(headpos, temp); } //判斷是否是同一棵二叉樹 for (int j = 0; j < L; j++) { resetFlag(headpos); same = 1; for (int i = 0; i < N; i++) { scanf("%d", &temp); if (same != 0) same = check(headpos, temp); } if (same == 1) cout << "Yes" << endl; else cout << "No" << endl; } same = 1; freeTree(headpos); } return 0; } link insert(link T, int val) { if (T == NULL) //如果該結點為空則創立新結點,結束遞歸 { T = new Node; T->val = val; T->flag = 0; T->left = NULL; T->right = NULL; return T; } if (val > T->val) { T->right = insert(T->right, val); } else { T->left = insert(T->left, val); } return T; } int check(link T, int val) { if (!T) //到達葉結點下一層 return 0; if(T->flag) { if (val > T->val) check(T->right, val); else if (val < T->val) check(T->left, val); else return 0; } else { if (val == T->val) { T->flag = 1; return 1; } else return 0; } } void freeTree(link T) { if (T->right) freeTree(T->right); if(T->left) freeTree(T->left); delete T; } void resetFlag(link T) { if (T->right) resetFlag(T->right); if (T->left) resetFlag(T->left); T->flag = 0; }
總結
04-樹4 是否同一棵二叉搜索樹