LeetCode | Balanced Binary Tree

제목:


Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees ofevery node never differ by more than 1.

아이디어:

방법 1: 두 개의 귀속, 한 개의 귀속은 나무의 높이를 구하고 다른 한 개의 귀속은 좌우 나무의 균형을 구한다.
방법2: 방법1에는 두 층의 귀속이 포함되어 있다. 우리는 추가 데이터 구조를 정의하여 하나의 귀속으로 전체 알고리즘을 완성할 수 있다.

코드:


방법 1:
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isBalanced(TreeNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(root == NULL)
        {
            return true;
        }
        else
        {
            int l = height(root->left);
            int r = height(root->right);
            
            if(l-r >= -1 && l-r <= 1)
            {
                return isBalanced(root->left) && isBalanced(root->right);
            }
            else
                return false;
        }
    }
    
    int height(TreeNode *root)
    {
        if(root == NULL)
        {
            return 0;
        }
        else
        {
            if(root->left == NULL)
            {
                return height(root->right) + 1;
            }
            else if(root->right == NULL)
            {
                return height(root->left) + 1;
            }
            else
            {
                int l = height(root->left);
                int r = height(root->right);
                
                return l

방법2:
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 
 struct SubTreeInfo{
     int height;
     bool isBalanced;
     SubTreeInfo(int height, bool isBalanced): height(height), isBalanced(isBalanced) {};
 };
class Solution {
public:
    bool isBalanced(TreeNode *root) {
        SubTreeInfo r = balanced(root);
        return r.isBalanced;
    }
    
    SubTreeInfo balanced(TreeNode* node){
        if(node == NULL){
            return SubTreeInfo(0, true);
        }
        else{
            SubTreeInfo left = balanced(node->left);
            SubTreeInfo right = balanced(node->right);
            int h = (left.height > right.height ? left.height : right.height) + 1;
            bool b = left.isBalanced && right.isBalanced;
            b = b && ((left.height - right.height >= -1)  && (left.height - right.height <= 1));
            return SubTreeInfo(h, b);
        }
    }
};

좋은 웹페이지 즐겨찾기