LeetCode 1261. 오염된 두 갈래 나무에서 원소를 찾다

오염된 두 갈래 나무에서 원소를 찾다

방법 1


먼저 dfs로 위에서 아래로 값을 수정합니다.그리고 어떤 값을 찾았을 때, 서열은 확정되었다.예를 들어 9->4->1->0.그리고 이 서열을 반복적으로 조회합니다.
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class FindElements {
public:
    TreeNode* root;
    FindElements(TreeNode* root) {
        this->root = root;
        root->val = 0;
        dfs(root);
    }

    void dfs(TreeNode* root){
        if(!root){
            return;
        }
        if(root->left){
            root->left->val = 2*root->val+1;
            dfs(root->left);
        }
        if(root->right){
            root->right->val = 2*root->val+2;
            dfs(root->right);
        }
    }

    bool find(int t) {
        stack<int> qs;
        while(t>0){
            qs.push(t);
            t = (t-1)/2;
        }
        TreeNode* p = root;
        while(!qs.empty()){
            if(!p){
                return false;
            }
            int x = qs.top();
            qs.pop();
            if(x==p->val*2+1){
                if(p->left)
                    p = p->left;
                else
                    return false;
            }else if(x==p->val*2+2){
                if(p->right)
                    p = p->right;
                else
                    return false;
            }else{
                return false;
            }
        }
        return true;   
    }
};

/**
 * Your FindElements object will be instantiated and called as such:
 * FindElements* obj = new FindElements(root);
 * bool param_1 = obj->find(target);
 */

방법 2


층계를 이용하여 두루 돌아다니는 질서정연한 다음에 직접 사용한다binary_search() 2점 찾기.
class FindElements {
public:
    vector<int> list;
    FindElements(TreeNode* root) {
        root->val = 0;
        dfs(root);
        layerOrder(root);
    }
    void dfs(TreeNode* root){
        if(!root){
            return;
        }
        if(root->left){
            root->left->val = 2*root->val+1;
            dfs(root->left);
        }
        if(root->right){
            root->right->val = 2*root->val+2;
            dfs(root->right);
        }
    }

    void layerOrder(TreeNode* root){
        queue<TreeNode*> q;
        q.push(root);
        while(q.size()){
            TreeNode* p = q.front();
            q.pop();
            list.push_back(p->val);
            if(p->left){
                q.push(p->left);
            }
            if(p->right){
                q.push(p->right);
            }
        }
    }


    bool find(int target) {
        return binary_search(list.begin(),list.end(),target);
    }
};

좋은 웹페이지 즐겨찾기