一、题目
1、审题
2、分析
给出一棵二叉树,判断其是否对称。
二、解答
1、思路:
方法一、
每次递归判断根节点的左孩子与根节点的右孩子是否相等。
public boolean isSymmetric(TreeNode root) { if(root == null) return true; return isSymmetric(root.left, root.right); } private boolean isSymmetric(TreeNode left, TreeNode right) { if(left == null && right == null) return true; if(left == null || right == null) return false; return left.val == right.val && (isSymmetric(left.right, right.left)) && (isSymmetric(left.left, right.right)); }
方法二、
新建一个栈空间,根节点的左孩子与根节点的右孩子同时入栈,出栈时出两个栈顶元素,判断其值是否相等。
若相等,在入根左孩子的左孩子与根右孩子的右孩子,在入栈根左孩子的右孩子与根右孩子的左孩子。
若栈不为空,再出两个栈顶元素进行判断。
public boolean isSymmetric(TreeNode root) { if(root == null) return true; Stack<TreeNode> stack = new Stack<>(); TreeNode left, right; if(root.left != null) { if(root.right == null) return false; stack.push(root.left); stack.push(root.right); } else if(root.right != null) return false; while(!stack.isEmpty()) { if(stack.size() % 2 != 0) return false; right = stack.pop(); left = stack.pop(); if(right.val != left.val) return false; if(left.left != null) { if(right.right == null) return false; stack.push(left.left); stack.push(right.right); } else if(right.right != null) return false; if(left.right != null) { if(right.left == null) return false; stack.push(left.right); stack.push(right.left); } else if(right.left != null) return false; } return true; }