一.检查两颗树是否相同
建议自己先动手试一试,不会再去看解析。
首先我们可以从题目中获得思路,俩个树要相同,那么它们的结构及每一个节点对应的值都应该相
同,所以我们需要遍历每一个元素来进行验证。
通常来说,二叉树都是采用递归的方法,这道题我也是一样用的递归。
根据以上分析和题目所给的两个根节点
第一步:
//首先如果其中一个为空,就不相同,返回false
if(p!=null && q==null || p==null && q!=null){
return false;
}
第二步:
//如果一开始2个节点都为空,那么返回false
if(p==null && q==null){
return true;
}
第三步:
/看节点中的值是否相同
if(p.val!=q.val){
return false;
}
以上就是我们要在一个节点里所做的事:
接下来,就得把每一个节点都过一下。
//根节点看完了,接下来看左右节点
return (isSameTree(p.left,q.left) && isSameTree(p.right,q.right));
注意:这里是并且,2个树的左边对左边,右边对右边。
综上,此题的代码为:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
//首先如果其中一个为空,就不相同
if(p!=null && q==null || p==null && q!=null){
return false;
}
//如果一开始2个节点都为空,那么返回false
if(p==null && q==null){
return true;
}
//看节点中的值是否相同
if(p.val!=q.val){
return false;
}
//根节点看完了,接下来看左右节点
return (isSameTree(p.left,q.left) && isSameTree(p.right,q.right));
}
}
做二叉树的题目,我们要学会把一个大问题拆分为若干个小问题。
然后勤加练习,多画图分析,你会发现也没有那么难。
二.另一颗树的子树
题目链接:572. 另一棵树的子树 - 力扣(LeetCode)
建议自己先动手试一试,不会再去看解析。
拿到这道题想一下,子树不就是父树的其中一部分或者是本身,所以就需要我们比较俩树是否相同
有了上一题的代码,我们就不用再写一遍比较树之间是否相同了。
题目给了2个节点,一个是父树节点root,子树节点subRoot。
第一步,我们需要进行判断,如果它们都为null,是不是就是空树,那子树就等于父树
if(root==null && subRoot==null)
return true;
第二步,继续判断,如果父树为null,那么子树除了也为null,否则无论subRoot都不是root的子树
if(root==null){
return false;
}
第三步,此时针对于两个树的根节点是否为空的问题已经结束,该讨论结构和值了。
我们可以引用上一道题的代码,将它们都传进去进行比较。
if(isSameTree(root,subRoot)){
return true;
}
如果从根节点起它们就相同的话就返回true,如果不同,那么就要第四步。
第四步,把root的左边和subRoot都传进isSubtree中进行递归,右边也是一样的操作。
if(isSubtree(root.left,subRoot)){
return true;
}
if(isSubtree(root.right,subRoot)){
return true;
}
意思是,在root的左边与右边找子树,找到了就返回true。
第五步,如果以上都找不到,那么说明这颗树不存在这样的子树
最后返回:false
综上所述,此题完整的代码为:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root==null && subRoot==null)
return true;
if(root==null){
return false;
}
if(isSameTree(root,subRoot)){
return true;
}
if(isSubtree(root.left,subRoot)){
return true;
}
if(isSubtree(root.right,subRoot)){
return true;
}
return false;
}1
public boolean isSameTree(TreeNode p, TreeNode q) {
//首先如果其中一个为空,就不相同
if(p!=null && q==null || p==null && q!=null){
return false;
}
//如果一开始2个节点都为空,那么返回false
if(p==null && q==null){
return true;
}
//看节点中的值是否相同
if(p.val!=q.val){
return false;
}
//根节点看完了,接下来看左右节点
return (isSameTree(p.left,q.left) && isSameTree(p.right,q.right));
}
}
三.翻转二叉树
题目链接:226. 翻转二叉树 - 力扣(LeetCode)
建议自己先动手试一试,不会再去看解析。
经过算是困难的上一道题,我们来做道简单点的。
说到反转,不就是交换嘛,那我们平时的交换是,假设a=10,b=20,它们要交换.
int tmp=a;
a=b;
b-tmp;
那么这道题也一样,我们是不是可以把根节点的左和右交换一下。
TreeNode tmp = root.left;
root.left = root.right;
root.right=tmp;
但是啊,还没完
我们会发现反转完,7的右边9换到左边去了,7的左边6换到右边去了,这时候我们要让7作为根节
点再进行反转不就行了,欸,就是这样子,没错!
综上,接下来看代码实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null){
return null;
}
TreeNode tmp = root.left;
root.left = root.right;
root.right=tmp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
如果觉得对你有所帮助的话,可以给我点点赞,谢谢你!