力扣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;}}