给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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

上期的问题是:127,相同的树

1public boolean isSameTree(TreeNode p, TreeNode q) {
2    if (p == null || q == nullreturn p == q;
3    return (p.val == q.val) && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
4}

解析:

通过递归的方式求解,代码很简单就不在介绍。我们来看一下非递归的解决方式

 1public boolean isSameTree(TreeNode p, TreeNode q) {
2    Stack<TreeNode> stack_p = new Stack<>();
3    Stack<TreeNode> stack_q = new Stack<>();
4    if (p != null) stack_p.push(p);
5    if (q != null) stack_q.push(q);
6    while (!stack_p.isEmpty() && !stack_q.isEmpty()) {
7        TreeNode pn = stack_p.pop();
8        TreeNode qn = stack_q.pop();
9        if (pn.val != qn.val) return false;
10        if (pn.right != null) stack_p.push(pn.right);
11        if (qn.right != null) stack_q.push(qn.right);
12        if (stack_p.size() != stack_q.size()) return false;
13        if (pn.left != null) stack_p.push(pn.left);
14        if (qn.left != null) stack_q.push(qn.left);
15        if (stack_p.size() != stack_q.size()) return false;
16    }
17    return stack_p.size() == stack_q.size();
18}