二叉树day3
226. 翻转二叉树
还是层序遍历,把子节点翻转一下就可以。
class Solution {
public TreeNode invertTree(TreeNode root) {
Deque<TreeNode> queue = new LinkedList<>();
if (root != null) queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode cur = queue.poll();
if (cur.left != null) queue.offer(cur.left);
if (cur.right != null) queue.offer(cur.right);
reverseDescendant(cur);
}
}
return root;
}
private void reverseDescendant(TreeNode node) {
TreeNode t = node.left;
node.left = node.right;
node.right = t;
}
}

递归亦可以实现,前序和后序比较适合解决此题。
//DFS 1.递归 后序
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
//左右中
invertTree(root.left);
invertTree(root.right);
reverseDescendant(root);
return root;
}
private void reverseDescendant(TreeNode node) {
TreeNode t = node.left;
node.left = node.right;
node.right = t;
}
}

迭代前序
//DFS 2.迭代 前序
class Solution {
public TreeNode invertTree(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<>();
if (root != null) stack.push(root);
while (!stack.isEmpty()) {
TreeNode cur = stack.pop();
reverseDescendant(cur); //中
//压栈右左, 出栈左右
if (cur.right != null) stack.push(cur.right);
if (cur.left != null) stack.push(cur.left);
}
return root;
}
private void reverseDescendant(TreeNode node) {
TreeNode t = node.left;
node.left = node.right;
node.right = t;
}
}

101. 对称二叉树
//左子树遍历方式:左右中;右子树遍历方式:右左中
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return compare(root.left, root.right);
}
private 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;
else return (compare(left.left, right.right) && compare(left.right, right.left));
}
}

一入递归深似海,从此offer是路人。明天继续写迭代。

浙公网安备 33010602011771号