7-4 是否同一棵二叉搜索樹 (25分)

7-4 是否同一棵二叉搜索樹 (25分)

開始是卡在怎麼讀數據上(果然還是讀數據可怕,好幾次都是卡在這裏??),中間有1、2天沒有再碰這道題。然後今天想着不能再拖了,就硬着頭皮解出來了。

想法:

一開始是想着不用構建樹,用數組處理的,但是左思右想沒有思路。
然後我就構建了的結構,用前序遍歷的方法來比較樹是不是相同
所以整體上來看思路比較簡單。

AC代碼:
/**
 * 這道題的主要思路是:
 * 就是讓比結點大的數的插入順序相同,比結點小的數的插入順序相同。
 * 但是感覺上面的比較麻煩,我好像寫不出來??
 * 所以我把樹建立了起來,然後用遍歷的方法比較是不是相同
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Leaves *Tree;
struct Leaves{
    int Data;
    Tree left,right;
};
//函數
int **ReadData(int n,int l); //讀取數據
Tree CreateNode(int item); //創造節點
Tree Insert(Tree q,int item); //插入
void PreTraverse(Tree q); //前序遍歷

int m = 0;
int vec1[100] = {0};
int vec2[100] = {0};

int main()
{
    int n,l;
    int **arr;
    int flag = 1;
    while(1){
        Tree front,rear; 
        scanf("%d",&n);
        if(n == 0) break;
        scanf("%d",&l);
        //讀取到arr數據
        arr = ReadData(n,l); 
        //每一次循環將vec1,vec2化爲零
        memset(vec1, 0, sizeof(int)*100); //memset函數,將數組元素全化爲0
        memset(vec2, 0, sizeof(int)*100); //memset函數,將數組元素全化爲0
        //初始化好第一棵樹
        front = CreateNode(arr[0][0]);
        for(int i=1;i<n;i++) Insert(front,arr[0][i]); //初始化第一棵樹
        //前序遍歷第一棵樹,保存在vec1中
        m = 0;
        PreTraverse(front);
        for(int i=0;i<m;i++) vec1[i] = vec2[i]; //將前序遍歷的結果都存放在vec2中。見PreTraverse函數
        //遍歷剩餘的樹並比較
        for(int i=1;i<=l;i++)
        {
            //初始化樹
            m = 0;flag = 1;
            rear = CreateNode(arr[i][0]);
            for(int j=1;j<n;j++) Insert(rear,arr[i][j]); 
            //遍歷樹
            PreTraverse(rear);
            //比較
            for(int n=0;n<m-1;n++) 
            {
                if(vec1[n] != vec2[n]) 
                {
                    printf("No\n");
                    flag = 0;
                    break;
                }
            }
            if(flag) printf("Yes\n");
        }
        //釋放每一行的地址
        for(int i = 0; i <= l; ++i) free(*(arr + i));
    }
    system("pause");
    return 0;
}
int **ReadData(int n,int l)
{
    int num;
    int **arr;
    arr = (int**)malloc(sizeof(int*)*(l+1));
    for(int j=0;j<=l;j++){ //爲每一行分配地址
        arr[j] = (int*)malloc(sizeof(int)*n);
    }
    for(int i=0;i<=l;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&num);
            arr[i][j] = num;
        }
    }
    return arr;
}
Tree CreateNode(int item)
{
    Tree q;
    q = (Tree)malloc(sizeof(struct Leaves));
    q->Data = item;
    q->left = q->right = NULL;
    return q;
}
Tree Insert(Tree q,int item)
{
    if(!q){
        q = CreateNode(0);
        q->Data = item;
    } 
    else if(item > q->Data){
        q->right = Insert(q->right,item);
    }
    else if(item < q->Data){
        q->left = Insert(q->left,item);
    }
    return q;
}
void PreTraverse(Tree q)
{
    vec2[m++] = q->Data;
    if(q->left) PreTraverse(q->left);
    if(q->right) PreTraverse(q->right);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章