
【解题思路】
首先想到的方法是,将二叉树按照中序遍历的方式将数据存储到一个链表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;
}
}
}
本文介绍了一种判断二叉树是否对称的有效方法。通过两种途径进行验证:一是利用中序遍历将二叉树节点值存入链表并检查其是否为回文序列;二是递归地比较二叉树的左右子树是否镜像对称。
528

被折叠的 条评论
为什么被折叠?



