力扣labuladong一刷day28天二叉树

力扣labuladong一刷day28天二叉树

文章目录

      • 力扣labuladong一刷day28天二叉树
      • 一、104. 二叉树的最大深度
      • 二、144. 二叉树的前序遍历
      • 三、543. 二叉树的直径

一、104. 二叉树的最大深度

题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/
思路:采用遍历来处理,只需要理解二叉树的遍历,在前序的位置进行处理是在进入一个节点之前,在后序的位置处理是在遍历完该节点的左右子树离开该节点时。
采用分解问题的方法,只需要考虑一个节点上该如何处理,其他节点都会经过递归进行相同的处理。
采用遍历的方式作。

class Solution {
    int max = 0, deep = 0;
    public int maxDepth(TreeNode root) {
        traverse(root);
        return max;
    }

    void traverse(TreeNode root) {
        if (root == null) {
            return;
        }
        deep++;
        if (root.left == null && root.right == null) {
            max = Math.max(max, deep);
        }
        traverse(root.left);
        traverse(root.right);
        deep--;
    }
}

采用分解问题的方法。

public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return Math.max(left, right) + 1;
    }

二、144. 二叉树的前序遍历

题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/
思路:采用遍历的方法。就是前序遍历,在进入节点之前记录下来该节点。

class Solution {
 
    List<Integer> list = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        traverse(root);
        return list;
    }
    
    void traverse(TreeNode root) {
        if (root == null) {
            return;
        }
        list.add(root.val);
        traverse(root.left);
        traverse(root.right);
    }
    
}

采用分解的思路,要记录前序遍历的结果,分解来看就是记录一个节点以及它的左子树和右子树,那么就进入该节点记录,然后把左子树记录的结果和右子树记录的结果都追加到list中。

class Solution {
 
   public List<Integer> preorderTraversal(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        List<Integer> list = new ArrayList<>();
        list.add(root.val);
        list.addAll(preorderTraversal(root.left));
        list.addAll(preorderTraversal(root.right));
        return list;
    }
}

三、543. 二叉树的直径

题目链接:https://leetcode.cn/problems/diameter-of-binary-tree/
思路:题目要求求任意两个节点之间的最长路径,那么就是任意一个节点的左子树深度加右子树深度。

class Solution {
  
   int max = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        traverse(root);
        return max;
    }
    
    int traverse(TreeNode root) {
        if (root == null) return 0;
        int left = traverse(root.left);
        int right = traverse(root.right);
        max = Math.max(max, left+right);
        return Math.max(left, right)+1;
    }

    
}

你可能感兴趣的:(力扣算法题,leetcode,算法,职场和发展)