二叉树实现的两种方法:递归、迭代。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
递归:第一:判断返回参数,boolean,参数是根节点迭代左右子节点。
第二:判断结束条件
第三:确定单层递归的逻辑,处理左右节点都不为空,且数值相同的情况。
比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
比较内测是否对称,传入左节点的右孩子,右节点的左孩子。
如果左右都对称就返回true ,有一侧不对称就返回false
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left, root.right);
}
private boolean compare(TreeNode left, TreeNode right) {
if (left == null && right == null) return true;
if (left == null && right != null) return false;
if (left != null && right == null) return false;
if (left.val != right.val) return false;
boolean compareOut = compare(left.left,right.right);
boolean compareIn = compare(left.right,right.left);
return compareIn && compareOut;
}
}
迭代:
class Solution {
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> deque = new LinkedList<>();
deque.offer(root.left);
deque.offer(root.right);
while (!deque.isEmpty()) {
TreeNode l = deque.poll();
TreeNode r = deque.poll();
if (l == null && r == null) continue;
if (l != null && r != null && l.val == r.val) {
//入栈顺序需要注意
deque.offer(l.left);
deque.offer(r.right);
deque.offer(l.right);
deque.offer(r.left);
}else {
//如果不符合上述条件,说明不对称
return false;
}
}
//如果经过上面循环没有输出false,说明每一步都通过了,左右对称
return true;
}
}