java:二叉树oj题分享

一.检查两颗树是否相同

题目链接:100. 相同的树 - 力扣(LeetCode)

 建议自己先动手试一试,不会再去看解析。

首先我们可以从题目中获得思路,俩个树要相同,那么它们的结构及每一个节点对应的值都应该相

同,所以我们需要遍历每一个元素来进行验证。

通常来说,二叉树都是采用递归的方法,这道题我也是一样用的递归。

根据以上分析和题目所给的两个根节点

第一步

 //首先如果其中一个为空,就不相同,返回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;

    }
}

如果觉得对你有所帮助的话,可以给我点点赞,谢谢你!

  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值