1. 程式人生 > >04-樹4 是否同一棵二叉搜尋樹 (25 分)

04-樹4 是否同一棵二叉搜尋樹 (25 分)

這裡寫圖片描述

4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

輸出樣例:

Yes
No
No

在經過老師講解下完成了程式碼實現

#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode* Tree;
struct TreeNode{
    int v;
    Tree Left,Right;
    int flag;//作為樹是否被訪問的標誌
};

Tree NewNode(int V){
    Tree T = (Tree)malloc(sizeof(struct TreeNode));
    T
->v=V; T->Left=T->Right=NULL; T->flag=0; return T; } int check(Tree T,int V){ if (T->flag) { if (V<T->v) return check(T->Left,V); else if (V>T->v) return check(T->Right, V); else return 0; }else
{ if (V==T->v) { T->flag=1; return 1; } else { return 0; } } } int Judge(Tree T,int N){ int i,V,flag=0;/*flag為0代表目前還不一致,1代表已經不一致*/ scanf("%d",&V); if (V!=T->v) { flag=1; }else { T->flag=1
; } for (i=1;i<N;i++) { scanf("%d",&V); if ((!flag)&&(!check(T, V))) { flag=1; } } if (flag) { return 0; }else { return 1; } } void ResetT(Tree T){ if (T->Left) { ResetT(T->Left); } if (T->Right) { ResetT(T->Right); } T->flag=0; } void FreeTree(Tree T){ if (T->Left) { FreeTree(T->Left); } if (T->Right) { FreeTree(T->Right); } free(T); } Tree Insert(Tree T,int V){ if (!T) { T = NewNode(V); }else { if (V>T->v) { T->Right=Insert(T->Right, V); }else { T->Left=Insert(T->Left, V); } } return T; } Tree MakeTree(int N){ Tree T; int i,V; scanf("%d",&V); T=NewNode(V); for (i = 1;i < N;i++) { scanf("%d",&V); T=Insert(T,V); } return T; } int main(int argc, char *argv[]) { int N,L,i; Tree T; scanf("%d",&N); while(N){ scanf("%d",&L); T=MakeTree(N); for(i = 0; i < L; i++){ if (Judge(T,N)) { printf("Yes\n"); }else{ printf("No\n"); } ResetT(T);//清除T中的標記flag } FreeTree(T); scanf("%d",&N); } return 0; }