【解题思路】
首先想到的方法是,将二叉树按照中序遍历的方式将数据存储到一个链表list中,比如root = [1,2,2,3,4,4,3]的中序序列是[3,2,4,1,4,2,3],如果链表是对称的,则认为二叉树是对称的。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
int len;
ArrayList<Integer> list = new ArrayList<Integer>();
search(root, list);
len = list.size();
for(int i = 0; i < len/2; i++)
{
if(list.get(i) != list.get(len-i-1))
{
return false;
}
}
return true;
}
public void search(TreeNode node, ArrayList<Integer> list)
{
if(node == null) return;
search(node.left, list);
list.add(node.val);
search(node.right, list);
}
}
而在上述测试样例中,中序序列是[2,2,1,2,2],链表是对称的,而二叉树不是对称的。
后来采用左右子树同时对称查找的方式来做:如果左节点等于对称的右节点,且它们的子树对称,表示这一对节点满足要求;否则认为这棵二叉树不是对称的。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
return search(root.left, root.right);
}
public boolean search(TreeNode L, TreeNode R)
{
if(L == null && R != null) return false;
else if(L != null && R == null) return false;
else if(L == null && R == null) return true;
else
{
if(search(L.left, R.right) && search(L.right, R.left))
{
if(L.val == R.val)
{
return true;
}
}
return false;
}
}
}