請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。
思路:首先根節點以及其左右子樹,左子樹的左子樹和右子樹的右子樹相同,左子樹的右子樹和右子樹的左子樹相同即可,採用遞歸,另外非遞歸也可,採用棧或隊列存取各級子樹根節點。
方法一
package lastfifteen;
public class treeSymmetrical {
boolean isSymmetrical(TreeNode pRoot)
{
TreeNode node = getMirror(pRoot);
return isSymmetrical(pRoot, node);
}
boolean isSymmetrical(TreeNode pRoot, TreeNode node)
{
if(pRoot == null && node == null){
return true;
}else if(pRoot == null|| node==null){
return false;
}
if(pRoot.val == node.val){
return isSymmetrical(pRoot.left, node.left)&&isSymmetrical(pRoot.right,node.right);
}
return false;
}
TreeNode getMirror(TreeNode pRoot){
if(pRoot == null){
return null;
}
TreeNode root = new TreeNode(pRoot.val);
root.right = getMirror(pRoot.left);
root.left = getMirror(pRoot.right);
return root;
}
}
方法二
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null) return true;
return isSymmetrical(pRoot.left,pRoot.right);
}
private boolean isSymmetrical(TreeNode left, TreeNode right) {
if(left==null&&right==null) return true;
if(left==null||right==null) return false;
if(left.val==right.val)
return isSymmetrical(left.left, right.right)&&isSymmetrical(left.right, right.left);
return false;
}
方法3
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null)
return true;
return help(pRoot.left, pRoot.right);
}
boolean help(TreeNode node1, TreeNode node2){
if(node1==null && node2 == null)
return true;
if(node1==null && node2!=null)
return false;
if(node1!=null && node2==null)
return false;
if(node1.val!=node2.val)
return false;
return help(node1.left, node2.right) && help(node1.right, node2.left);
}