力扣labuladong——一刷day57

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、力扣1379. 找出克隆二叉树中的相同节点
  • 二、力扣LCR 143. 子结构判断
  • 三、力扣110. 平衡二叉树
  • 四、力扣250. 统计同值子树


前言


有些题目,你按照拍脑袋的方式去做,可能发现需要在递归代码中调用其他递归函数计算字数的信息。一般来说,出现这种情况时你可以考虑用后序遍历的思维方式来优化算法,利用后序遍历传递子树的信息,避免过高的时间复杂度

一、力扣1379. 找出克隆二叉树中的相同节点

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    TreeNode res = null;
    public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
        fun(original,cloned,target);
        return res;
    }
    public void fun(TreeNode original, TreeNode cloned, TreeNode target){
        if(original == null){
            return;
        }
        if(original == target){
            res = cloned;
            return;
        }
        fun(original.left,cloned.left,target);
        fun(original.right,cloned.right,target);
    }
}

二、力扣LCR 143. 子结构判断

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(B == null){
            return false;
        }
        if(A == null){
            return B == null;
        }
        if(fun(A,B)){
            return true;
        }
        return isSubStructure(A.left,B) || isSubStructure(A.right,B);
    }
    public boolean fun(TreeNode A , TreeNode B){
        if (B == null) {
            return true;
        }
        if (B != null && A == null) {
            return false;
        }
        if(A.val != B.val){
            return false;
        }
        return fun(A.left,B.left) && fun(A.right,B.right);
    }
}

三、力扣110. 平衡二叉树

/**
 * 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 {
    boolean flag = true;
    public boolean isBalanced(TreeNode root) {
        fun(root);
        return flag;
    }
    public int fun(TreeNode root){
        if(root == null){
            return 0;
        }
        int l = fun(root.left);
        int r = fun(root.right);
        if(Math.abs(l-r) > 1){
            flag = false;
        }
        return l > r ? l + 1:r +1;
    }
}

四、力扣250. 统计同值子树

/**
 * 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 int countUnivalSubtrees(TreeNode root) {
        if(root == null){
            return 0;
        }
        int cur = 0;
        if(fun(root,root.val)){
            cur = 1;
        }
        int l = countUnivalSubtrees(root.left);
        int r = countUnivalSubtrees(root.right);
        return cur + l + r;
    }
    public boolean fun(TreeNode root,int val){
        if(root == null){
            return true;
        }
        if(root.val != val){
            return false;
        }
        return fun(root.left,val) && fun(root.right,val);
    }
}

你可能感兴趣的:(力扣题解,leetcode,算法,职场和发展,java,数据结构)