「ソードフィンガーオファー」:【クラシック詳細説明】対称二分木、二分木が対称かどうかを判断する機能を実装してください。二分木がこの二分木の鏡像と同じである場合、それは対称として定義されることに注意してください。

1.タイトルの説明

二分木が対称であるかどうかを判断する関数を実装してください。二分木がこの二分木の鏡像と同じである場合、それは対称として定義されることに注意してください。

 トピック分析:最初に写真を見てください

  1. 二分木の鏡像を見つけるために、それが対称であるかどうかを決定する別の方法を書くことができます
  2. 空であると判断された場合は、最初に左ルートノード&&右ルートノードが空であるかどうかを判断し、空の場合はtrueを返します。
  3. 非対称性を判断するために、左側のルートノード||右側のルートノードが空であるかどうかにかかわらず、戻り値はfalseです。
  4.  対称性を決定するために使用される方法は再帰です。具体的には、左のサブツリーの左の子と右のサブツリーの右の子が等しいかどうかを判断します&&左のサブツリーの右の子と右のサブツリーの左の子が等しいかどうか

2.コードの実装

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
/*
    对称的二叉树,类似于下面的情况
         A
      B      B
    D   C  C   D
    
*/
public class Solution {
    boolean isSymmetry(TreeNode leftRoot,TreeNode rightRoot){
      // 如果左边的和右边的树为空,只有一个,返回true
      if(leftRoot == null && rightRoot == null){
         return true;
      }
      // 判断不对称的情况
      if(leftRoot == null || rightRoot == null){
         return false;
      }
      // 判断对称的情况
      if(leftRoot.val == rightRoot.val){
        // 再判断同层的根结点的左孩子,和同层的右结点的右孩子是否对称
        // 和 左结点的右孩子和右结点的左孩子是否对称,两个条件同时成立
        //知道最后一个结果都返回的是空
        return isSymmetry(leftRoot.left,rightRoot.right) && isSymmetry(leftRoot.right,rightRoot.left);
      }else{
        return false;
      }
    }
    
    boolean isSymmetrical(TreeNode pRoot)
    {
        if(pRoot == null){
          return true;
        }else{
          return isSymmetry(pRoot.left,pRoot.right);
        }
    }
  
}

3.まとめ

  1. オファーに残された唯一のものは、バイナリツリーと他の関連する問題のほとんどです。アルゴリズムは本当にIQ税を支払わなければなりません

  2. 頑張って、申し出を終えて、要約を書いて、さあ!

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/Sunshineoe/article/details/110677919