题目:给定一个二叉树,根节点给root,验证其是否为对称二叉树
对称二叉树的特性为根节点的左子树和右子树是完全镜像的
解法一:递归
- 如果根节点给null,或者根节点没有左右子树,则这是一个对称二叉树
- 临界条件为root节点左子树的左子树等于root节点右子树的右子树,root节点左子树的右子树等于root节点右子树的左子树
- 递归遍历左右子树完成验证
代码如下
/**
* 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;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null){
return true;
}
return dfs(root.left,root.right);
}
private boolean dfs(TreeNode left,TreeNode right){
//1.两个子树都为空,返回ture
if(left == null && right == null){
return true;
}
//2.有一颗子树不为空,返回false
if(left == null || right == null){
return false;
}
//3.两颗子树的值不相等返回false
if(left.val != right.val){
return false;
}
//4.比较左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树
return dfs(left.left,right.right)&&dfs(left.right,right.left);
}
}
该解法的时间复杂度为遍历整个数的所有节点,为O(n)
空间复杂度为数的深度,最差情况下(整个数的所有节点在同一个子树方向,此时累死与链表),为O(n)
解法二:迭代
迭代的方法根据广度优先遍历,使用队列作为辅助存储,重点步骤如下:
- root节点的左右子树先入队列
- 校验队列是否为空,为空则结束
- 队首的前两个节点,(记为N1,N2)先出队列,将校验这两个节点是否相等,不等则结束
- 将N1的左子树根节点和N2的右子树根节点入队列,N1的右子树根节点和N2的左子树根节点入队列
具体代码参考如下:
boolean bfs(TreeNode root){
//1.校验root节点是否为空
if(root == null){
return true;
}
//2.使用队列作为辅助,将root节点左右子树入队列进行初始化
Queue<TreeNode> treeQueue = new LinkedList<TreeNode>();
treeQueue.offer(root.left);
treeQueue.offer(root.right);
//3.广度遍历平衡树
while(!treeQueue.isEmpty()){
TreeNode leftNode = treeQueue.poll();
TreeNode rightNode = treeQueue.poll();
//3.1 左右子树对称位置的节点都为空,则跳过
if(leftNode == null && rightNode==null){
continue;
}
//3.2 左右子树对称位置只有一个节点为空,则非对称树
if(leftNode == null || rightNode == null){
return false;
}
//3.3 左右子树对称位置节点值不相等,非对称树
if(leftNode.val != rightNode.val){
return false;
}
//3.4 继续广度遍历,将左子树的左子树和右子树的右子树入队列
treeQueue.offer(leftNode.left);
treeQueue.offer(rightNode.right);
//3.5 将左子树的右子树的右子树的左子树入队列
treeQueue.offer(leftNode.right);
treeQueue.offer(rightNode.left);
}
//4.通过所有校验,则为平衡树
return true;
}
迭代方法的时间负责度同样为遍历完整个对称树的所有节点,为O(n)
空间复杂度为队列的长度,为O(n)