解题思路:
向下进行递归求解:满足hasPathSum(TreeNode root, int sum)
等价于满足 hasPathSum(root.right, sum -val)
或 hasPathSum(root.left, sum -val)
寻找退出条件:当最后一次递归时 sum - root.val == 0
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Solution { public boolean hasPathSum(TreeNode root, int sum) { if (root == null) return false; if (root.left == null && root.right == null) return sum - root.val == 0;
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val); } }
|
递归解法:
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
因此,该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
- 它们的两个根结点具有相同的值
- 每个树的右子树都与另一个树的左子树镜像对称
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/symmetric-tree/solution/dui-cheng-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public boolean isSymmetric(TreeNode root) { return check(root, root); }
public boolean check(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if (p == null || q == null) { return false; } return p.val == q.val && check(p.left, q.right) && check(p.right, q.left); } }
|
迭代解法:
「方法一」中我们用递归的方法实现了对称性的判断,那么如何用迭代的方法实现呢?首先我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/symmetric-tree/solution/dui-cheng-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public boolean isSymmetric(TreeNode root) { return check(root, root); }
public boolean check(TreeNode u, TreeNode v) { Queue<TreeNode> q = new LinkedList<TreeNode>(); q.offer(u); q.offer(v); while (!q.isEmpty()) { u = q.poll(); v = q.poll(); if (u == null && v == null) { continue; } if ((u == null || v == null) || (u.val != v.val)) { return false; }
q.offer(u.left); q.offer(v.right);
q.offer(u.right); q.offer(v.left); } return true; } }
|
1 2 3 4 5
| class Solution { public int maxDepth(TreeNode root) { return root == null ? 0 : Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; } }
|
解体思路:
设置一个 Queue 用来存放每一层的节点
当 Queue 不为空的时候,遍历 Queue
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { LinkedList<List<Integer>> res = new LinkedList<>(); if (root == null) { return res; } Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { List<Integer> oneLevel = new ArrayList<>(); int count = queue.size(); for (int i = 0; i < count; i++) { TreeNode node = queue.poll(); oneLevel.add(node.val); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } res.addFirst(oneLevel); } return res; } }
|
执行结果:
解题思路:
将有序数组转化为二叉搜索树,由 BST 的性质可知转化后所得的 BST 的根节点为有序数组最中间的数,根节点的左子节点为有序数组前半段最中间的数,根节点的右子节点为有序数组后半段的中间数,依次类推……
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
class Solution { public TreeNode sortedArrayToBST(int[] nums) { return add(nums, 0, nums.length - 1); }
public TreeNode add(int[] nums, int left, int right) { if (left > right) { return null; }
int mid = left + (right - left) / 2; TreeNode root = new TreeNode(nums[mid]); root.left = add(nums, left, mid - 1); root.right = add(nums, mid + 1, right); return root; } }
|