2024王道408数据结构P144 T17

2024王道408数据结构P144 T17

思考过程

  1. 先看题目,让我们判断两棵二叉树是否相似,相似指的是以下三个方面:
    • T1和T2都是空的二叉树或T1和T2都只有一个结点
    • T1的左子树和T2的左子树是相似的,且T1的右子树和T2的右子树是相似的。

题目的意思我们可以简化为两个大类,要么为空要么为非空。

  1. 我们只要判断当前结点是两个都为空还是一个为空另一个不为空就行了,因为如果一个为空另一个不为空则说明这两棵树必不可能相似。如果两个结点都空的话我们函数结果return 1,把一个结点为空另一个结点不空的话函数返回return 0。

代码过程

  1. 正如我们上面所说的,我们需要判断三种情况
    • 如果两个结点都为空的话if(T1 == NULL && T2 == NULL)说明这两棵树必是相似的,我们直接return 1;就好了。
    • 如果两个结点中有一个结点为空if (T1 == NULL || T2 == NULL),另一个结点不为空的话说明这两棵树必不可能相似,我们返回0return 0;
    • 第三种情况就是两个结点都不为空,也就是我们需要用递归来判断剩下的结点是否相似,我们创建两个变量left和right,left用来表示两个结点的左子树是否相似,如果相似的话给我们返回1,不相似则返回0;right也一样,用来表示两个结点的右子树是否相似 。假设我们给函数取名叫similarleft = similar(T1->lchild, T2->lchild); right = similar(T1->rchild, T2->rchild);最后返回的时候我们返回return (left && right);用逻辑与&&,左右两边都为1结果才是1,有0则0。

到这里这题就做完了。

完整代码

cpp 复制代码
//
// 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主@吸血小金鱼,找工作真难呜呜呜呜呜呜

相关推荐
伏小白白白21 分钟前
【论文精度-2】求解车辆路径问题的神经组合优化算法:综合展望(Yubin Xiao,2025)
人工智能·算法·机器学习
无敌最俊朗@1 小时前
数组-力扣hot56-合并区间
数据结构·算法·leetcode
囚生CY1 小时前
【速写】优化的深度与广度(Adam & Moun)
人工智能·python·算法
码农多耕地呗2 小时前
力扣94.二叉树的中序遍历(递归and迭代法)(java)
数据结构·算法·leetcode
懒羊羊不懒@2 小时前
Java基础语法—最小单位、及注释
java·c语言·开发语言·数据结构·学习·算法
白云千载尽3 小时前
leetcode 912.排序数组
算法·leetcode·职场和发展
哆啦刘小洋3 小时前
Tips:预封装约束的状态定义
算法
代码充电宝3 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
Juan_20124 小时前
P1040题解
c++·算法·动态规划·题解
Onesoft%J1ao4 小时前
C++竞赛递推算法-斐波那契数列常见题型与例题详解
c++·算法·动态规划·递推·信息学奥赛