思路:主要就是比较两棵子树的外部和内部是否分别相同
思路一:想到了层序遍历,一个从左,一个从右,然后进行比较,但实践起来发现对于空节点位置会出现问题,如果对空节点做标记,那么遍历又无法到达终点了,因此思路一失败
思路二:一边遍历,一边比较左右树的外侧(左树.left,右树.right)与内侧(左树.right,右树.left)是否相同,参照之前的递归遍历可以很容易写出如下代码(不同点在于一次性遍历两棵树)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root)
{
//同时遍历两根树的外围,比较是否相同
return compare(root.left,root.right);
}
private boolean compare(TreeNode left,TreeNode right)
{
if(left == null && right == null) return true;
else if(left == null && right != null) return false;
else if(left != null && right == null) return false;
else if(left.val != right.val) return false;
//若都相等进行下一步判断
return compare(left.left,right.right) && compare(left.right,right.left);
}
}
除了递归的方法,同样还可以用栈
public boolean isSymmetric(TreeNode root)
{
//新建栈模拟递归
Stack<TreeNode> leftStack = new Stack();
Stack<TreeNode> rightStack = new Stack();
//左右子树根节点入栈
leftStack.push(root.left);
rightStack.push(root.right);
//结束条件:二者有一个为空
while(!leftStack.isEmpty() || !rightStack.isEmpty())
{
//取出左右树当前结点
TreeNode left = leftStack.pop();
TreeNode right = rightStack.pop();
//比较当前结点
if(left == null && right == null) continue;
else if(left == null && right != null) return false;
else if(left != null && right == null) return false;
else if(left.val != right.val) return false;
leftStack.push(left.left);
leftStack.push(left.right);
rightStack.push(right.right);
rightStack.push(right.left);
}
return true;
}