Skip to content
文档章节

BM31 对称的二叉树

描述

给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)

例如下面这棵二叉树是对称的 bm31-1

下面这棵二叉树不对称。 bm31-2

数据范围:节点数满足 10000≤n≤1000,节点上的值满足 |1000∣val∣≤1000

要求:空间复杂度 O(n),时间复杂度 O(n)

备注:

你可以用递归和迭代两种方法解决这个问题

示例1

输入{1,2,2,3,4,4,3}

返回值:true

示例2

输入:{8,6,9,5,7,7,5}

返回值:false

题解

tsx
/*class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param pRoot TreeNode类 
 * @return bool布尔型
 */
export function isSymmetrical(pRoot: TreeNode): boolean {
    // write code here
  if(!pRoot) return true;
//   左右节点不对称
  if((!pRoot.left && pRoot.right) || (pRoot.left && !pRoot.right)) return false;
  if(!pRoot.left && !pRoot.right) return true;
  
  var pstack: TreeNode[] = [pRoot.left];
  var qstack: TreeNode[] = [pRoot.right];
  
  while(pstack.length && qstack.length) {
    var p: TreeNode = pstack.pop();
    var q: TreeNode = qstack.pop();
    if(!p || !q || p.val !== q.val) return false;
    
    if((!p.left && q.right) || (p.left && !q.right)) return false;
    if((!p.right && q.left) || (p.right && !q.left)) return false;
    
   
    if(p.right && q.left) {
      pstack.push(p.right);
      qstack.push(q.left)
    }
       
      if(p.left && q.right) {
      pstack.push(p.left);
      qstack.push(q.right)
    }
  }
  if(pstack.length || qstack.length) return false;
  return true;
}

递归

ts
public class Solution {
  boolean recursion(TreeNode root1, TreeNode root2){
      //可以两个都为空
      if(root1 == null && root2 == null) 
          return true;
      //只有一个为空或者节点值不同,必定不对称
      if(root1 == null || root2 == null || root1.val != root2.val) 
          return false;
      //每层对应的节点进入递归比较
      return recursion(root1.left, root2.right) && recursion(root1.right, root2.left);
  }
  boolean isSymmetrical(TreeNode pRoot) {
      return recursion(pRoot, pRoot);
  }
}