二叉树-另一课树的子树

详细题目请登入网址:572. 另一棵树的子树 - 力扣(LeetCode)

下面是针对本题做的一些分析

看到数值相等,会不会想起之前写道的单值二叉树呢?哎,对喽,要调用到它,用来判断数值勒

我写判断结构部分代码就行喽!

那怎么写呢?

我讲一下思路吧!弄两个指针分别指向树A,树B,一开始指向树的根节点,如果根节点的值不相同,开始递归呗,递归根节点左子树,根据上头给出的示例1,树A的左子树节点是4,和树B的节点数值上是相同,接着递归4的左子树,都是1,是相同的,接着递归1的左子树,都是NULL,然后回溯到4返回true,再递归4的右子树,是2,递归子树B节点4的右子树,是2,哎是相同的,节点2继续递归呗,递归后是NULL,是相同的,那带着好消息回溯呗,回溯到4.

从根节点开始,向右重复以上递归的转化成代码如下

结构上怎么写函数呢?其实也用到递归,写一个函数是通过递归判断树结构

什么意思呢?

之前我埋了伏笔,记得这句话吗?开始指向树的根节点,如果根节点的值不相同,开始递归呗

根值不相同,继续递归,目的是什么呢?可以想一想啊!这里留给大家三分钟思考时间

好,我公布答案啦,根值不同,继续递归,

是找值相同的节点,然后返回true

如果在左孩子找到了,直接用它,如果有孩子找到,直接用它

然后我们要多思考些

空树呢?一个树非空,一个树是空,空树肯定不是非空树的子树

完整代码如下

接下来整函数递归图

判断一个二叉树是否为另一棵子树,可以采用递归的方法,先判断当前根节点是否相同,若相同则递归判断左右子树是否相同,若不同则递归判断原二叉树的左右子树是否为目标子树。 具体实现步骤如下: 1. 判断当前节点是否为空,若为空则返回 false。 2. 判断当前节点是否与目标的根节点相同,若相同则递归判断左右子树是否相同。 3. 若当前节点与目标的根节点不同,则递归判断原二叉树的左右子树是否为目标子树。 具体实现代码如下(假设 TreeNode 为二叉树节点的数据结构): ``` bool isSubtree(TreeNode* s, TreeNode* t) { if (!s) return false; // 若当前节点为空,返回 false if (isSameTree(s, t)) return true; // 若当前节点与目标根节点相同,递归判断左右子树是否相同 return isSubtree(s->left, t) || isSubtree(s->right, t); // 若不同,则递归判断原二叉树的左右子树是否为目标子树 } bool isSameTree(TreeNode* p, TreeNode* q) { if (!p && !q) return true; // 若两个节点均为空,返回 true if (!p || !q) return false; // 若其中一个节点为空,返回 false if (p->val != q->val) return false; // 若两个节点的值不同,返回 false return isSameTree(p->left, q->left) && isSameTree(p->right, q->right); // 递归判断左右子树是否相同 } ``` 其中 isSameTree 函数用于判断两个节点以及它们的子树是否相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值