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);
}