请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/
对于二叉树问题首先考虑应当是递归。利用栈的先进后出特性也能解决二叉树的题目,但是效率没有递归效率高。
public class Test28{
//栈
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 rightNode = stack.pop(); //右出栈
TreeNode leftNode = stack.pop(); //左出栈
if (rightNode == null && leftNode == null)
continue;
if (rightNode == null || leftNode == null || rightNode.val != leftNode.val)
return false;
stack.push(leftNode.left);
stack.push(rightNode.right);
stack.push(leftNode.right);
stack.push(rightNode.left);
}
return true;
}
//递归
public boolean isSymmetric2(TreeNode root) {
if (root == null)
return true;
return recure(root.left,root.right);
}
private boolean recure(TreeNode left, TreeNode right) {
if (left == null && right == null)
return true;
if (left == null || right == null || left.val != right.val)
return false;
return recure(left.left, right.right) && recure(left.right,right.left);
}
}