目录
1. 检查两颗树是否相同
100. 相同的树 - 力扣(LeetCode) (leetcode-cn.com)
思路:
- 以子问题的思路解题。遍历这棵树->前序
- 一个为空,一个不为空 或 都不为空但值不一样【结构不同】
- 都不为空,对应值一样【结构相同,值一样】
- 确定了根,再去确定其左数和右树
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
if ((p == null && q != null)||(q == null && p != null)) {
return false;
}
if (p.val != q.val){
return false;
}
return isSameTree(p.left, q.left)&&isSameTree(p.right, q.right);
}
}
2. 另一棵树的子树
572. 另一棵树的子树 - 力扣(LeetCode) (leetcode-cn.com)
思路:
一个为空,一个不为空的情况
判断根 -> root和Subroot是不是本身就是两颗相同的树
判断根的左数root.left和Subroot.left是不是相同的
判断根的右数root.right和Subroot.right是不是相同的
不满足前三个条件
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
if (p == null && q != null || p != null && q == null) return false;
if (p.val != q.val) return false;
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
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;
}
}
3. 判断一颗二叉树是否是平衡二叉树
Loading Question... - 力扣(LeetCode) (leetcode-cn.com)
子问题思路:
- 先判断根节点是不是平衡(得先求左右树的高度)
- 再判断根的左树和根的右树是不是平衡的
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int leftHeight = maxDepth(root.left);
int rightHeight = maxDepth(root.right);
return (leftHeight > rightHeight) ? leftHeight+1 : rightHeight+1;
}
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
int leftHeight = maxDepth(root.left);
int rightHeight = maxDepth(root.right);
return (Math.abs(leftHeight-rightHeight)<=1) && isBalanced(root.left) && isBalanced(root.right);
}
}
3.* 平衡二叉树最优版O(N)解法!!
边求高度边判断是否平衡
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int leftHeight = maxDepth(root.left);
int rightHeight = maxDepth(root.right);
if (leftHeight >= 0 && rightHeight >= 0 && Math.abs(leftHeight-rightHeight) <= 1) {
return Math.max(leftHeight,rightHeight) + 1;
} else {
return-1;
}
}
public boolean isBalanced(TreeNode root) {
return maxDepth(root) >= 0;
}
}
4. 对称二叉树
101. 对称二叉树 - 力扣(LeetCode) (leetcode-cn.com)
思路:
class Solution {
//左树和右树是不是对称的
public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree) {
if (leftTree == null && rightTree != null || leftTree != null && rightTree == null) {
return false;
}
if (leftTree == null && rightTree == null) {
return true;
}
if (leftTree.val != rightTree.val) {
return false;
}
return isSymmetricChild(leftTree.left, rightTree.right) && isSymmetricChild(leftTree.right, rightTree.left);
}
public boolean isSymmetric(TreeNode root) {
if (root == null) return false;
return isSymmetricChild(root.left, root.right);
}
}