LeetCode - 226. Invert Binary Tree 翻转二叉树
解题思路这里的翻转二叉树翻转的不只是数值,而是改变左右指针的指向。二叉树的题目大多需要遍历,因此在做二叉树递归时一定要先判断前中后序哪一个适合遍历。以下代码是前序遍历(中左右)的思路
class Solution {
public TreeNode invertTree(TreeNode root) {
invert(root);
return root;
}
public void invert(TreeNode root) {
if (root == null) return;
//swap(中)
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invert(root.left);//左
invert(root.right);//右
}
}
LeetCode - 101. Symmetric Tree 翻转二叉树
解题目标:给定一个二叉树,判断是否是一个对称二叉树
解题思路:这道题刚开始自己写的时候思路有错,不能单纯地判断左右子树是否相等,而是相互翻转的关系。问题的关键点也就是左子树翻转后是否等于右子树。在二叉树的题目中确定遍历顺序是很关键的。这道题就只能使用后序遍历(左右中),因为当前节点是否翻转与另一边的节点相等需要率先判断左右子节点给到的信息才能得出结果。 注意在单次迭代的时候左节点的左子节点相比较的是应该是右节点的右子节点(外侧节点),内侧节点也是同理。左子树比较顺序是左右中,右子树的比较顺序是右左中,最后判断一定是左右都处理完后才判断中节点。
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left, root.right);
}
public boolean compare(TreeNode left, TreeNode right) {
if (left == null && right != null) {
return false;
}
else if (left != null && right == null) {
return false;
}
else if (left == null && right == null) {
return true;
}
else if (left.val != right.val) return false;
boolean outsideNodes = compare(left.left, right.right); // 左子树:左, 右子树:右
boolean insideNodes = compare(left.right, right.left); // 左子树:右, 右子树:左
return outsideNodes && insideNodes; // 中
}
}
LeetCode - 104. 二叉树最大深度
解题思路:想要找到最大深度,实际上可以转化为求二叉树的高度,应该从叶子节点从下至上给父节点传递信息,所以应该采用后序遍历(左右中),因为在每一层都要先判断左右子节点的最大高度。
class Solution {
public int maxDepth(TreeNode root) {
return getHight(root);
}
public int getHight(TreeNode root) {
if (root == null) return 0;
//left hight
int leftHight = getHight(root.left); // 左
int rightHight = getHight(root.right); // 右
int hight = Math.max(leftHight, rightHight) + 1;// 中
return hight;
}
}
了解了后序遍历,其实可以简化代码:
class Solution {
public int maxDepth(TreeNode root) {
return getHight(root);
}
public int getHight(TreeNode root) {
if (root == null) return 0;
return Math.max(getHight(root.left), getHight(root.right)) + 1;
}
}
LeetCode - 111. 二叉树最小深度
解题思路:求最小深度和求最大深度还是不太一样,最小深度的定义是根节点到最近的叶子节点的距离,因此不能直接把上一题的max()换成min(),否则会包括了根节点压根没有左/右子树最后得出最小深度为1的情况。这题依然是后序遍历,但是左/右子树为空的情况需要分别考虑。
class Solution {
public int minDepth(TreeNode root) {
return getMinDepth(root);
}
public int getMinDepth(TreeNode root) {
if (root == null) return 0;
int leftDepth = getMinDepth(root.left);
int rightDepth = getMinDepth(root.right);
if (root.left == null && root.right != null) {
return rightDepth + 1;
}
else if (root.left != null && root.right == null) {
return leftDepth + 1;
} else {
return Math.min(leftDepth, rightDepth) + 1;
}
}
}