leetcode 222 Count Complete Tree Nodes (완전 이 진 트 리 포인트 계산)

1. 문제 설명
완전 이 진 트 리 의 노드 수 를 계산 하 다.완전 이 진 트 리 에 대한 정 의 는 위 키 백과 의 내용 을 참고 할 수 있 습 니 다.
2. 방법 과 사고방식
가장 간단 하고 생각 하기 쉬 운 방법 은 재 귀 를 사용 하여 좌우 서브 트 리 의 노드 수 를 재 귀 적 으로 계산 하 는 것 이다.그러나 이 방법 은 시간 을 초과 하기 쉬 워 일반적으로 바람 직 하지 않다.  
int countNodes(TreeNode* root) {
        if(root == NULL) return 0;
        else if(root->left == NULL) return 1;

        return countNodes(root->left) + countNodes(root->right);
    }

이 코드 로 제출 하면 과연 시간 이 초과 되 었 다.그럼 어떻게 개선 할 까요?그것 은 만 이 진 트 리 를 이용 하여 알고리즘 을 간소화 하 는 것 이다.만 이 진 트 리 의 노드 수 계산 공식 은 N = 2 ^ h - 1. h 는 이 진 트 리 의 층수 이다.귀속 과정 은 다음 과 같다.
4. 567917. 현재 노드 를 뿌리 노드 로 하 는 수가 만 이 진 트 리 인지 판단 합 니 다. 노드 의 개 수 를 계산 하고 돌아 가면 다시 실행 하지 않 으 면 계속 아래로 실 행 됩 니 다
4. 567917. 현재 노드 의 왼쪽 나무 와 오른쪽 나무 에 대해 각각 판단 하고 하 나 를 더 하면 이 노드 의 수 를 나타 낸다
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */
class Solution {
public:
    int nodesofMan(TreeNode* root){ //         ,             。
        int l=1,r=1;
        TreeNode *node = root;
        while(node->left)
        {
            l++;
            node = node->left;
        }
        node = root;
        while(node->right)
        {
            r++;
            node = node->right;
        }

        if(l == r)
            return (int)pow(2,(double)l) - 1;
        else
            return 0;
    }
    int countNodes(TreeNode* root) {
        if(root == NULL) return 0;
        //else if(root->left == NULL) return 1;

        if(nodesofMan(root)) return nodesofMan(root);
        else
            return countNodes(root->left) + countNodes(root->right) +1;
    }
};

좋은 웹페이지 즐겨찾기