검지offer58.대칭적인 두 갈래 나무

8181 단어

제목 설명


두 갈래 나무가 대칭적인지 아닌지를 판단하는 함수를 실현하세요.만약 두 갈래 나무가 이 두 갈래 나무와 같은 거울이라면 대칭으로 정의하십시오.

생각:


두 갈래 나무의 거울은 대칭적이어서 귀속을 이용한다.

참고 사항:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def isSymmetrical(self, pRoot):
        # write code here
        return self.IsSymmetrical(pRoot, pRoot)

    def IsSymmetrical(self, pRoot1, pRoot2):
        if pRoot1 == None and pRoot2 == None:
            return True
        if pRoot1 == None or pRoot2 == None:
            return False
        if pRoot1.val != pRoot2.val:
            return False
        return self.IsSymmetrical(pRoot1.left, pRoot2.right) and self.IsSymmetrical(pRoot1.right, pRoot2.left)



C++ 버전 추가:
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        if(pRoot == NULL){
            return true;
        }
        
        return isSysmetricalHelper(pRoot, pRoot);
       
    }
    
private:
    bool isSysmetricalHelper(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot1 == NULL && pRoot2 == NULL){
            return true;
        }
        if(pRoot1 == NULL || pRoot2 == NULL){
            return false;
        }
        if(pRoot1->val != pRoot2->val){
            return false;
        }
        return isSysmetricalHelper(pRoot1->left, pRoot2->right) && isSysmetricalHelper(pRoot1->right, pRoot2->left);
    }
};

Note

  • 이 귀착 사고방식은 매우 뚜렷하고 자신이 한 것보다 훨씬 뚜렷하다.
  • 의 중점은 모두 마지막 문장에 있다. return isSysmetricalHelper(pRoot1->left, pRoot2->right) && isSysmetricalHelper(pRoot1->right, pRoot2->left), 이를 통해 대칭성을 확보한다.
  • 좋은 웹페이지 즐겨찾기