[검지 Offer] 두 갈래 트리 중 하나가 되는 경로

문제 설명


두 갈래 트리와 정수를 입력하고 두 갈래 트리의 결점 값과 정수를 입력하기 위한 모든 경로를 출력합니다.경로는 나무의 뿌리 결점에서 시작하여 잎 결점까지 내려가는 결점으로 경로를 형성합니다.

알고리즘 분석

  • 만약에 루트가 입력수와 같으면 루트를 반환수 그룹에 넣고 반환한다.만약 루트가 입력 수보다 크면 빈 값을 되돌려줍니다.만약root가 입력수보다 작으면 root를 수조에 넣고 입력수는 자동으로 root를 줄이고 root의 하위 트리에 따라 귀속한다
  • 만약에 입력 수가 0이고 좌우 트리가 비어 있으면 잎 노드이고 이 경로는 실행할 수 있으며 수조로 되돌아갈 수 있다.만약 루트에 하위 트리가 없다면, 동시에 입력 수가 0이 되지 않으면, 이 길이 통하지 않는다는 것을 설명하고, NULL로 돌아갑니다..

  • 코드 구현

    /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/
    class Solution {
    public:
        vector<vector<int> > FindPath(TreeNode* root, intexpectNumber) {
            vector<vector<int> > result;
            if(root == NULL) {
                return result;
            }
            int data = root->val;
            if(expectNumber < data) {
                return result;
            }
    
            elseif(expectNumber == data) {
                vector<int> x;
                x.push_back(data);
                result.push_back(x);
            }
    
            else{
                expectNumber -= data;
                bool left = findPath(&result, root->left, expectNumber);
                bool right = findPath(&result, root->right, expectNumber);
                if( left || right ) {
                    for(int i = 0; i < result.size(); i++) {
                        result[i].push_back(data);
                        reverse(&(result[i]));
                    }
                }
            }
            return result;
        }
    
        bool findPath(vector<vector<int> >* result, TreeNode* root, intexpectNumber) {
            if(root == NULL && expectNumber == 0) {
                return true;
            }
            elseif(root == NULL) {
                return false;
            }
    
            int data = root->val;
    
            if(expectNumber < data) {
                return false;
            }
    
            elseif(expectNumber == data&& root->left == NULL && root->right == NULL) {
                vector<int> x;
                x.push_back(data);
                result->push_back(x);
            }
    
            else{
                expectNumber -= data;
                vector<vector<int> > left;
                bool bLeft = findPath(&left, root->left, expectNumber);
                if(bLeft) {
                    for(inti = 0; i < left.size(); i++) {
                        left.at(i).push_back(data);
                        result->push_back(left[i]);
                    }
                }
                vector<vector<int> > right;
                bool bRight = findPath(&right, root->right, expectNumber);
                if(bRight) {
                    for(int i = 0; i < right.size(); i++) {
                        right.at(i).push_back(data);
                        result->push_back(right[i]);
                    }
                }
            }
    
            return result;
        }
    
        void reverse(vector<int>* v) {
            int size = v->size();
            int half = size / 2;
            for(inti = 0; i < half; i++) {
                int tmp = v->at(i);
                v->at(i) = v->at(size - i - 1);
                v->at(size - i - 1) = tmp;
            }
        }
    };
    

    좋은 웹페이지 즐겨찾기