对称二叉树

题目:给定一个二叉树,根节点给root,验证其是否为对称二叉树

对称二叉树的特性为根节点的左子树和右子树是完全镜像的

解法一:递归

  1. 如果根节点给null,或者根节点没有左右子树,则这是一个对称二叉树
  2. 临界条件为root节点左子树的左子树等于root节点右子树的右子树,root节点左子树的右子树等于root节点右子树的左子树
  3. 递归遍历左右子树完成验证

代码如下

/**
 * 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)

解法二:迭代

迭代的方法根据广度优先遍历,使用队列作为辅助存储,重点步骤如下:

  1. root节点的左右子树先入队列
  2. 校验队列是否为空,为空则结束
  3. 队首的前两个节点,(记为N1,N2)先出队列,将校验这两个节点是否相等,不等则结束
  4. 将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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值