两种思路:
思路1
建立一个翻转的二叉树newroot ,然后比较两个二叉树是都相同。
翻转代码:
TreeNode jing(TreeNode root)
{
if(root == null || (root.left == null && root.right == null))
return root;
TreeNode newroot = new TreeNode(root.val);
newroot.left = jing(root.right);
newroot.right = jing(root.left);
return newroot;
}
比较相同代码:
boolean cur(TreeNode A , TreeNode B)
{
if((A == null && B != null) || (B == null && A != null))
return false;
if(A == null && B == null)
return true;
else
return A.val == B.val && cur(A.left, B.left) && cur(A.right ,B.right);
}
总体代码:
/**
* 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 || (root.left == null && root.right == null))
return true;
TreeNode newroot = jing(root);
return cur(newroot ,root);
}
TreeNode jing(TreeNode root)
{
if(root == null || (root.left == null && root.right == null))
return root;
TreeNode newroot = new TreeNode(root.val);
newroot.left = jing(root.right);
newroot.right = jing(root.left);
return newroot;
}
boolean cur(TreeNode A , TreeNode B)
{
if((A == null && B != null) || (B == null && A != null))
return false;
if(A == null && B == null)
return true;
else
return A.val == B.val && cur(A.left, B.left) && cur(A.right ,B.right);
}
}
效果还可以:
思路2
可以不建立翻转二叉树,只需要将root树以两种不同的方式遍历即可,左树使用先序遍历,即中-》左-》右;
右树使用先序反遍历,即中-》右-》左;
只需要修改上思路1 的cur函数即可:
boolean cur(TreeNode A , TreeNode B)
{
if((A == null && B != null) || (B == null && A != null))
return false;
if(A == null && B == null)
return true;
else
return A.val == B.val && cur(A.left, B.right) && cur(A.right ,B.left);
}
如果为空节点或者叶子节点返回,否则比较A树的左孩子和右树的右孩子。
代码如下:
/**
* 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) {
return cur(root ,root);
}
boolean cur(TreeNode A , TreeNode B)
{
if((A == null && B != null) || (B == null && A != null))
return false;
if(A == null && B == null)
return true;
else
return A.val == B.val && cur(A.left, B.right) && cur(A.right ,B.left);
}
}