题解 | #对称的二叉树#

对称的二叉树

https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb

方法一:二叉树递归(递归过程符合思考逻辑)

注意最后一句,每棵子树都要对称

1. 终止条件:子问题结点是否对称 2. 返回值: 每一级将子问题是否匹配的结果往上传递。

最坏情况下,时间复杂度为O(n),二叉树递归和计算中的复杂递归不同,这里的递归就是遍历!

  • step 1:两种方向的前序遍历,同步过程中的当前两个节点,同为空,属于对称的范畴。
  • step 2:当前两个节点只有一个为空或者节点值不相等,已经不是对称的二叉树了。
  • step 3:第一个节点的左子树与第二个节点的右子树同步递归对比,第一个节点的右子树与第二个节点的左子树同步递归比较。
    public class Solution {
      boolean isSymmetrical(TreeNode pRoot) {
          if(pRoot==null)return true;
          return compareNode(pRoot.left,pRoot.right);
      }
      boolean compareNode(TreeNode left,TreeNode right){
          if(left==null) return right==null;
          if(right==null) return left==null;
          if(left.val!=right.val)return false;
          return compareNode(left.right,right.left)&&compareNode(left.left,right.right);
      }
    }

    方法二:两个队列分别从两边层序遍历

    boolean isSymmetrical(TreeNode pRoot) {
          if(pRoot==null)return true;
          Queue<TreeNode> q1 = new LinkedList<>();
          Queue<TreeNode> q2 = new LinkedList<>();
          q1.offer(pRoot.left);
          q2.offer(pRoot.right);//先比较第二层两个子结点
          while(q1.size()!=0||q2.size()!=0){
              TreeNode lNode = q1.poll();
              TreeNode rNode = q2.poll();
              if(lNode==null&&rNode==null)continue;
              //结点数值不同或存在一个为null,则不对称
              if(lNode==null||rNode==null||lNode.val!=rNode.val)return false;
              //q1从左至右层次遍历
              q1.offer(lNode.left);
              q1.offer(lNode.right);
              //q2从右至左层次遍历
              q2.offer(rNode.right);
              q2.offer(rNode.left);
          }
          return true;//遍历过后没出现不对称的情况就返回true
      }

    两种方法时间复杂度空间复杂度一致,时间上都是一次完整遍历,空间上一个是开辟递归栈空间,一个是队列存储空间,这两个空间都与结点数量n相关。

全部评论

相关推荐

01-01 23:23
复旦大学 Java
点赞 评论 收藏
分享
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
2025-12-04 15:36
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务