226.翻转二叉树
深度优先遍历,把每个节点的左子树和右子树交换。
class Solution {
public TreeNode invertTree(TreeNode root) {
invert(root);
return root;
}
public void invert(TreeNode node) {
if (node == null) {
return;
}
// if (node.left == null && node.right == null) {
// return;
// }
TreeNode temp = node.right;
node.right = node.left;
node.left = temp;
invert(node.left);
invert(node.right);
return;
}
}
101.对称二叉树
深度优先遍历,如果两个节点都有左右子节点。那么比较左节点的左子节点和右节点的右子节点(树外侧),比较左节点的右子节点和右节点的左子节点(树内侧)。
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return compare(root.left, root.right);
}
public boolean compare(TreeNode leftNode, TreeNode rightNode) {
if (leftNode == null && rightNode == null) {
return true;
} else if (leftNode != null && rightNode == null) {
return false;
} else if (leftNode == null && rightNode != null) {
return false;
} else if (leftNode.val != rightNode.val) {
return false;
}
boolean out = compare(leftNode.left, rightNode.right);
boolean in = compare(leftNode.right, rightNode.left);
return out && in;
}
}
523.二叉树的直径
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
递归,维护一个全局变量res存放最大路径结果。求每个节点左子树和右子树的高度,如果左右子树高度加起来比res大,那么更新res,返回值则是左右子树的最大高度。
class Solution {
int res;
public int diameterOfBinaryTree(TreeNode root) {
res = 0;
depth(root);
return res;
}
public int depth(TreeNode node) {
if (node == null) {
return 0;
}
int l = depth(node.left);
int r = depth(node.right);
res = Math.max(l + r, res);
return Math.max(l, r) + 1;
}
}