问题描述
- Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Example:
Bonus points if you could solve it both recursively and iteratively.
- 地址
问题分析
- 该题是看一棵树是否是镜像二叉树。类似于 LeetCode 100. Same Tree ,如果看一棵树是否镜像二叉树,可以转化为左子树与右子树是否互为镜像这个问题。两棵树若成镜像,那么要满足三方面:
- 两树的根节点的值相同
- 树1的左子树与树2的右子树成镜像
- 树1的右子树与树2的左子树成镜像
- 递归法
- 非递归法
- 类似于前序遍历非递归实现,不过现在用的是一个栈(每次弹出两个节点)
- 类似层序遍历,用的是一个队列(每次出队两个节点)
经验教训
- 非递归的两种实现方法,可以用两个栈或队列,也可以用一个栈或者队列
代码实现
- 递归法
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isSymmetric(root.left, root.right);
}
public boolean isSymmetric(TreeNode root1, TreeNode root2) {
if (root1 == null || root2 == null) { //从20%到 80% 的跃升...
return root1 == root2;
}
/*
if (root1 == null && root2 == null) {
return true;
}
if (root1 == null || root2 == null) {
return false;
}
*/
return root1.val == root2.val && isSymmetric(root1.left, root2.right) && isSymmetric(root1.right, root2.left);
}
- 非递归法
- 栈
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root.left);
stack.push(root.right);
while (! stack.isEmpty()) {
TreeNode node1 = stack.pop();
TreeNode node2 = stack.pop();
if (node1 == null && node2 == null) {
continue;
}
if (node1 == null || node2 == null || node1.val != node2.val) {
return false;
}
stack.push(node1.left);
stack.push(node2.right);
stack.push(node1.right);
stack.push(node2.left);
}
return true;
}
* 队列
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while(! queue.isEmpty()) {
TreeNode node1 = queue.remove();
TreeNode node2 = queue.remove();
if (node1 == null && node2 == null) {
continue;
}
if (node1 == null || node2 == null || node1.val != node2.val) {
return false;
}
queue.add(node1.left);
queue.add(node2.right);
queue.add(node1.right);
queue.add(node2.left);
}
return true;
}