package org.example.test;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class SymmetricTest {
    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(2);
        node1.left = node2;
        node1.right = node3;
        System.out.println(isSymmetric(node1));
    }

    static public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    /**
     * 迭代算法,BFS
     *
     * @param root
     * @return
     */
    public static boolean isSymmetric(TreeNode root) {
        // write code here
        if (root == null) {
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        Stack<Integer> stack = new Stack<>();
        while (!queue.isEmpty()) {
            int size = queue.size();
            if (size % 2 != 0 && queue.peek() != root) {
                return false;
            }
            int half = size / 2;
            while (size > 0) {
                TreeNode node = queue.poll();
                if (size > half) {
                    stack.push(node == null ? 1 : node.val);
                } else {
                    int tmp = node == null ? 1 : node.val;
                    if (stack.pop() != tmp) {
                        return false;
                    }
                }
                size--;
                if (node == null) {
                    continue;
                }
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.left == null && node.right != null) {
                    queue.offer(null);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
                if (node.left != null && node.right == null) {
                    queue.offer(null);
                }
            }
        }
        return true;
    }

/**
     * 递归算法
     *
     * @param root
     * @return
     */
    public static boolean isSymmetric1(TreeNode root) {
        if (root == null) {
            return true;
        }
        TreeNode left = root.left;
        TreeNode right = root.right;
        return symmetric(left, right);
    }

    private static boolean symmetric(TreeNode left, TreeNode right) {
        if (left == null && right == null) {
            return true;
        }
        if (left == null) {
            return false;
        }
        if (right == null) {
            return false;
        }
        if (left.val != right.val) {
            return false;
        }
        boolean x = symmetric(left.left, right.right);
        boolean y = symmetric(left.right, right.left);
        return x && y;
    }
}