#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef char Element;
typedef struct BiNode{
Element data;
struct BiNode *lchild, *rchild;
}BiNode,*BiTree;
void create_tree(BiTree &T){ // 参数取地址不用返回值
T = (BiTree)malloc(sizeof(BiNode));
cin >> T->data;
if (T->data == '#'){
T = NULL;
return ;
}
create_tree(T->lchild);
create_tree(T->rchild);
}
int judge_TreeSimilarity(BiTree T1, BiTree T2){ //判定二叉树是否相似
int left, right;
if (T1 == NULL && T2 == NULL){
return 1;
}
else if(T1 ==NULL || T2 ==NULL){//T1HE
return 0;
}
left = judge_TreeSimilarity(T1->lchild, T2->lchild);
right = judge_TreeSimilarity(T1->rchild, T2->rchild);
return left && right;
}
void precede_Tree(BiTree T){//二叉树前序遍历
if (T != NULL){
printf_s("%c", T->data);
precede_Tree(T->lchild);
precede_Tree(T->rchild);
}
}
int main(){
BiTree T1;
BiTree T2;
int result;
printf_s("创建二叉树1:");
create_tree(T1);
printf_s("创建二叉树2:");
create_tree(T2);
printf_s("二叉树1前序遍历结果:");
precede_Tree(T1);
printf("\n");
result = judge_TreeSimilarity(T1, T2);
switch (result)
{
case 0:
printf_s("二叉树1 和 二叉树2 不是相似二叉树");
break;
case 1:
printf_s("二叉树1 和 二叉树2 是相似二叉树");
break;
}
system("pause");
return 0;
}
运行结果:
本人用VS2013编写由于输入输出没加代码所以printf时需要_S.
判断二叉树相似时思想:
①判断两颗二叉树是否都为空,如果都为空时则为相似二叉树
②判断两颗二叉树是否不同时为空,如果不同时为空则不是相似二叉树
③两颗树都不为空时,利用递归的思想判断两棵树的左子树和右子树是否为相似二叉树