1: 思路
迭代算法:一个二叉树相等==根结点相同+ 左子树相同+右子树相同
1.1
获取结构体成员
通过结构体指针可以获取结构体成员,一般形式为:
(pointer).memberName
或者:
pointer->memberName
第一种写法中,.的优先级高于,(pointer)两边的括号不能少。如果去掉括号写作pointer.memberName,那么就等效于*(pointer.memberName),这样意义就完全不对了。
第二种写法中,**->**是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途
2:算法
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define BOOL int
typedef int TElemType;
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BOOL SimilarTree(BiTree T1,BiTree T2)
{
if(T1==NULL&&T2==NULL) return TRUE; // 如果两个均为空树,退出迭代,相等
if(T1==NULL||T2==NULL) return FALSE; //如果两个只有一个为空树,则不相等
if(T1->data!=T2->data) return FALSE; //如果此结点数据不相等则,退出迭代
return SimilarTree(T1->lchild,T2->lchild)&& SimilarTree(T1->rchild,T2->rchild);
}
void CreateBiTree(BiTree *T){
*T=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->data=1;
(*T)->lchild=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->rchild=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->lchild->data=2;
(*T)->lchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->lchild->rchild=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->lchild->rchild->data=5;
(*T)->lchild->rchild->lchild=NULL;
(*T)->lchild->rchild->rchild=NULL;
(*T)->rchild->data=3;
(*T)->rchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->rchild->lchild->data=6;
(*T)->rchild->lchild->lchild=NULL;
(*T)->rchild->lchild->rchild=NULL;
(*T)->rchild->rchild=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->rchild->rchild->data=7;
(*T)->rchild->rchild->lchild=NULL;
(*T)->rchild->rchild->rchild=NULL;
(*T)->lchild->lchild->data=4;
(*T)->lchild->lchild->lchild=NULL;
(*T)->lchild->lchild->rchild=NULL;
}
int main()
{
BiTree T1, T2;
CreateBiTree(&T1);
CreateBiTree(&T2);
printf("%d",SimilarTree(T1,T2));
}