设计一个递归算法,BOOL similarTree()检查二叉链表是否完全相同

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

3:运行结果:

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值