package com.interview.algorithms.tree;
import com.interview.basics.model.tree.BinaryTreeNode;
/**
* Created_By: stefanie
* Date: 14-11-5
* Time: 下午4:00
*/
public class C5_26_SymmetricTreeChecker {
public static boolean isSymmeticRecursive(BinaryTreeNode root){
if(root == null) return true;
else return isMirror(root.left, root.right);
}
private static boolean isMirror(BinaryTreeNode n1, BinaryTreeNode n2) {
if(n1 == null && n2 == null) return true;
else if(n1 == null || n2 == null) return false;
else if(!n1.value.equals(n2.value)) return false;
else return isMirror(n1.left, n2.right) && isMirror(n1.right, n2.left);
}
public static boolean isSymmeticIterative(BinaryTreeNode root){
BinaryTreeNode[] nodes = new BinaryTreeNode[1];
nodes[0] = root;
int nonEmptySize = 1;
while(nodes.length > 0){
if(nonEmptySize == 0) break;
nodes = visitByLayer(nodes, nonEmptySize);
nonEmptySize = 0;
for(int i = 0; i < nodes.length / 2; i++){
int j = nodes.length - 1 - i;
if(nodes[i] != null && nodes[j] != null){
nonEmptySize += 2;
if(!nodes[i].value.equals(nodes[j].value)) return false;
else continue;
}
if(nodes[i] != null || nodes[j] != null) return false;
}
}
return true;
}
private static BinaryTreeNode[] visitByLayer(BinaryTreeNode[] nodes, int nonEmptySize){
BinaryTreeNode[] children = new BinaryTreeNode[nonEmptySize * 2];
int j = 0;
for(int i = 0; i < nodes.length; i++){
if(nodes[i] != null){
children[j++] = nodes[i].left;
children[j++] = nodes[i].right;
}
}
return children;
}
}