题目的意思我们可以简化为两个大类,要么为空要么为非空。
2. 我们只要判断当前结点是两个都为空还是一个为空另一个不为空就行了,因为如果一个为空另一个不为空则说明这两棵树必不可能相似。如果两个结点都空的话我们函数结果return 1,把一个结点为空另一个结点不空的话函数返回return 0。
if(T1 == NULL && T2 == NULL)
说明这两棵树必是相似的,我们直接return 1;
就好了。if (T1 == NULL || T2 == NULL)
,另一个结点不为空的话说明这两棵树必不可能相似,我们返回0return 0;
left = similar(T1->lchild, T2->lchild); right = similar(T1->rchild, T2->rchild);
最后返回的时候我们返回return (left && right);
用逻辑与&&,左右两边都为1结果才是1,有0则0。到这里这题就做完了。
//
// Created by 黎圣 on 2023/8/26.
//
/*
* 试设计判断两颗二叉树是否相似的算法。所谓二叉树T1和T2相似,指的是
* T1和T2都是空的二叉树
* 或都只有一个根结点
* 或T1的左子树和T2的左子树是相似的,且T1的右子树和T2的右子树是相似的。
*/
#include "iostream"
using namespace std;
typedef struct TreeNode
{
char data;
struct TreeNode *lchild, *rchild;
}*tree;
void CreateTree(tree &t)
{
char ch;
cin >> ch;
if (ch == '#')
t = NULL;
else
{
t = (struct TreeNode *)malloc(sizeof(struct TreeNode));
t->data = ch;
t->lchild = NULL;
t->rchild = NULL;
CreateTree(t->lchild);
CreateTree(t->rchild);
}
}
//递归比较左右子树 空+空 = 1 空+非空 = 0
int similar(tree T1, tree T2)
{
int left, right;
if (T1 == NULL && T2 == NULL)
return 1;
else if (T1 == NULL || T2 == NULL)
return 0;
else
{
left = similar(T1->lchild, T2->lchild);
right = similar(T1->lchild, T2->rchild);
return (left && right);
}
}
int main()
{
tree t1, t2;
CreateTree(t1);
CreateTree(t2);
printf("%d", similar(t1, t2));
return 0;
}
最后感谢b站up主@吸血小金鱼,找工作真难呜呜呜呜呜呜