博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Subtree of Another Tree 另一个树的子树
阅读量:7017 次
发布时间:2019-06-28

本文共 1924 字,大约阅读时间需要 6 分钟。

 

Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node's descendants. The tree scould also be considered as a subtree of itself.

Example 1:

Given tree s:

3    / \   4   5  / \ 1   2

Given tree t:

4   / \ 1   2

Return true, because t has the same structure and node values with a subtree of s.

 

Example 2:

Given tree s:

3    / \   4   5  / \ 1   2    /   0

Given tree t:

4  / \ 1   2

Return false.

 

这道题让我们求一个数是否是另一个树的子树,从题目中的第二个例子中可以看出,子树必须是从叶结点开始的,中间某个部分的不能算是子树,那么我们转换一下思路,是不是从s的某个结点开始,跟t的所有结构都一样,那么问题就转换成了判断两棵树是否相同,也就是的问题了,这点想通了其实代码就很好写了,用递归来写十分的简洁,我们先从s的根结点开始,跟t比较,如果两棵树完全相同,那么返回true,否则就分别对s的左子结点和右子结点调用递归再次来判断是否相同,只要有一个返回true了,就表示可以找得到。

 

解法一:

class Solution {public:    bool isSubtree(TreeNode* s, TreeNode* t) {        if (!s) return false;        if (isSame(s, t)) return true;        return isSubtree(s->left, t) || isSubtree(s->right, t);    }    bool isSame(TreeNode* s, TreeNode* t) {        if (!s && !t) return true;        if (!s || !t) return false;        if (s->val != t->val) return false;        return isSame(s->left, t->left) && isSame(s->right, t->right);    }};

 

下面这道题的解法用到了之前那道的解法,思路是对s和t两棵树分别进行序列化,各生成一个字符串,如果t的字符串是s的子串的话,就说明t是s的子树,但是需要注意的是,为了避免出现[12], [2], 这种情况,虽然2也是12的子串,但是[2]却不是[12]的子树,所以我们再序列化的时候要特殊处理一下,就是在每个结点值前面都加上一个字符,比如',',来分隔开,那么[12]序列化后就是",12,#",而[2]序列化之后就是",2,#",这样就可以完美的解决之前的问题了,参见代码如下:

 

解法二:

class Solution {public:    bool isSubtree(TreeNode* s, TreeNode* t) {        ostringstream os1, os2;        serialize(s, os1);        serialize(t, os2);        return os1.str().find(os2.str()) != string::npos;    }    void serialize(TreeNode* node, ostringstream& os) {        if (!node) os << ",#";        else {            os << "," << node->val;            serialize(node->left, os);            serialize(node->right, os);        }    }};

 

类似题目:

 

 

参考资料:

 

转载地址:http://orwxl.baihongyu.com/

你可能感兴趣的文章
JEECG 3.6.5版本发布,企业级JAVA快速开发平台
查看>>
Emacs笔记
查看>>
can not load translations from {cn.yml path} ex...
查看>>
Hive基本操作
查看>>
MySQL学习笔记(一):逻辑架构学习
查看>>
【Oracle Database】Oracle RAC(八):服务资源管理
查看>>
自动化运维之Ansible应用基础模块(超详细)
查看>>
eyoucms的添加发布内容
查看>>
javascript面向对象中继承实现?
查看>>
变频电源的故障分类目录
查看>>
python中,random模块
查看>>
jquery图片轮播切换
查看>>
U盘文件删除怎么恢复?最新教程
查看>>
如何将两个PDF文件合并到一个页面中
查看>>
当你的发的邮件被截获后
查看>>
如何实时监测分析X-Forwarded-For伪造
查看>>
分享转帖 -- 留给自己看(应酬)
查看>>
sed 命令中使用变量
查看>>
面试技巧
查看>>
TypeScript 接口
查看>>