101 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
graph TD
1((1)) --- 21((2))
1((1)) --- 22((2))
21((2)) --- 31((3))
21((2)) --- 32((4))
22((2)) --- 33((4))
22((2)) --- 34((3))
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
graph TD
1((1)) --- 21((2))
1((1)) --- 22((2))
21((2)) --- 31((null))
21((2)) --- 32((3))
22((2)) --- 33((null))
22((2)) --- 34((3))
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
此题二叉树对称条件:
两个节点的值相等。左节点的左子树与右节点的右子树镜像对称。左节点的右子树和右节点的左子树镜像对称。
二叉树通常涉及树的周游算法
深度周游(递归)和广度周游(队列)
递归解法
对称需要比较两个节点的左子树和右子树,右子树和左子树。时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root);
}
boolean isMirror(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val) && isMirror(t1.right, t2.left) && isMirror(t1.left, t2.right);
}
思考误区:想要使用递归,但是纠结于单个节点下的节点之间的关系。没有形成节点与子树的关系认知
队列解法
将树的左右节点依次推入队列中,按照队列出队次序比较两节点的值。时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
q.add(root);
while(!q.isEmpty()){
TreeNode t1 = q.poll();
TreeNode t2 = q.poll();
if(t1 == null && t2 == null){
continue;
}
if(t1 == null || t2 == null){
return false;
}
if(t1.val != t2.val){
return false;
}
q.add(t1.right);
q.add(t2.left);
q.add(t1.left);
q.add(t2.right);
}
return true;
}

浙公网安备 33010602011771号