Leetcode의 두 갈래 나무가 두루 총결되다

47304 단어 Leetcode
두 갈래 나무의 여러 가지 흐름을 총괄하고 싶었는데, 두 갈래 나무의 네 가지 흐름을 잘 파악한 토대에서 다른 문제는 자연히 쉽게 풀렸다.앞, 중, 뒤의 순서는 귀속과 비귀속의 묘사법이 있기 때문에 반드시 파악해야 한다. 층계가 두루 돌아다니는 것은 바로 비귀속이다.
1. Leetcode 144를 앞뒤로 훑어본다.Binary Tree Preorder Traversal
/*
 * 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:
    vector<int> preorderTraversal(TreeNode* root) {
        
        vector<int> res;
        
        if( root == NULL )
            return res;
        
        __preorderTraversal(root, res);
        return res;
            
    }
    
private:
    void __preorderTraversal(TreeNode* node, vector<int>& res){
        
        if( node == NULL )
            return;
        
        res.push_back(node->val);
        __preorderTraversal(node->left, res);
        __preorderTraversal(node->right, res);
        
        return;
    }
};

// 
class Solution {

public:
    vector<int> preorderTraversal(TreeNode* root) {

        vector<int> res;
        
        if(root == NULL)
            return res;

        stack<TreeNode*> stack;
        TreeNode* cur = root;
        while(cur != NULL || !stack.empty()){
            while(cur != NULL){
                res.push_back(cur->val);
                stack.push(cur);
                cur = cur->left;
            }

            cur = stack.top();
            stack.pop();
            cur = cur->right;
        }
        return res;
    }
};

2. Leetcode 94를 반복합니다.Binary Tree Inorder Traversal
/**
 * 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:
    vector<int> inorderTraversal(TreeNode* root) {
        
        vector<int> res;
        if(root == NULL)
        	return res;
        __inorderTraversal(root, res);
        
        return res;
    }
    
private:
    void __inorderTraversal(TreeNode* node, vector<int>& res){
        
       if(node == NULL)
           return;
           
        __inorderTraversal(node->left, res);
        res.push_back(node->val);
        __inorderTraversal(node->right, res);
        
        return;
    }
};

// 
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        
        vector<int> res;
        if( root == NULL )
            return res;
        
        stack<TreeNode*> stack;
        TreeNode* cur = root;
        
        while( cur != NULL || !stack.empty() ){
            
            while( cur != NULL ){
                stack.push( cur );
                cur = cur->left;
            }
            
            cur = stack.top();
            stack.pop();
            res.push_back( cur->val );
            cur = cur->right;
        }
        
        return res;
    }
};

3. Leetcode 145를 뒤돌아본다.Binary Tree Postorder Traversal
/**
 * 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:
    vector<int> postorderTraversal(TreeNode* root) {
        
        vector<int> res;
        if( root == NULL )
            return res;
        
        __postorderTraversal(root, res);
        return res;
        
    }
    
private:
    void __postorderTraversal(TreeNode* node, vector<int>& res){
        
        if( node == NULL )
            return;
        
        __postorderTraversal(node->left, res);
        __postorderTraversal(node->right, res);
        res.push_back( node->val );
        
        return;
    }
};

// 
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        
        vector<int> res;
        if( root == NULL )
            return res;
        
        stack<TreeNode*> stack;
        TreeNode* pre = NULL;
        TreeNode* cur = root;
        
        while( cur != NULL || !stack.empty() ){
            
            while( cur != NULL ){
                
                stack.push( cur );
                cur = cur->left;
            }
            
                cur = stack.top();
                stack.pop();
                
                if( cur->right == NULL || pre == cur->right ){
                    
                    res.push_back( cur->val );
                    pre = cur;
                    cur = NULL;
                }
                else{
                    
                    stack.push(cur);
                    cur = cur->right;
                }
        }
        
        return res;
    }
};

4. 층차가 102번을 반복한다.Binary Tree Level Order Traversal
/**
 * 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:
    vector<vector<int>> levelOrder(TreeNode* root) {
        
        vector<vector<int>> res;
        
        if(root == NULL)
            return res;
        
        queue<TreeNode*> q;
        q.push(root);
        int level_num = 1;
        
        while( !q.empty() ){
            
            int new_level_num = 0;
            vector<int> level;
            
            for(int i = 0; i < level_num; i++){
                TreeNode* node = q.front();
                q.pop();
                level.push_back(node->val);

                if(node->left){
                    q.push(node->left);
                    new_level_num++;
                }
                if(node->right){
                    q.push(node->right);
                    new_level_num++;
                }
            }
            res.push_back(level);
            level_num = new_level_num;
        }
        
        return res;
    }
};

층차는 두 가지 변체가 있는데 그것이 바로 우시수와 지자수이다.우시수는 바로 한 그루의 나무 오른쪽에 서 있는 아이입니다. 보는 아이입니다. 생각: 처음부터 생각한 것은 층층이 차례대로 하는 것입니다. 그런데 어떻게 층층이 가장 오른쪽에 있는 아이를 얻을 수 있을까요?당시 102를 참고하여 한 층마다vector로 저장하고 for순환을 통해 매번 마지막 값을 찾으면 된다고 생각했지만 좀 귀찮아서 손을 대지 않았다.뒤에 스택으로 저장하는 것을 발견하면 뒤에 바로 top () 가 훨씬 간단해진다.
우시수 Leetcode 199.Binary Tree Right Side View를 102에서 바로 vector를 stack으로 바꿨습니다.
/**
 * 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:
    vector<int> rightSideView(TreeNode* root) {
        
        vector<int> res;
        
        if(root == NULL)
            return res;
        
        queue<TreeNode*> q;
        q.push(root);
        int level_num = 1;
        
        while( !q.empty() ){
            
            int new_level_num = 0;
            stack<int> level;
            
            for(int i = 0; i < level_num; i++){
                TreeNode* node = q.front();
                q.pop();
                level.push(node->val);

                if(node->left){
                    q.push(node->left);
                    new_level_num++;
                }
                if(node->right){
                    q.push(node->right);
                    new_level_num++;
                }
            }
            res.push_back( level.top() );
            level_num = new_level_num;
        }
        
        return res;
    }
};

Leetcode 103.Binary Tree Zigzag Level Order Traversal은 보조 창고 2개가 필요합니다.
/**
 * 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:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        
        vector<vector<int>> res;
        if(root == NULL)
            return res;
        
        stack<TreeNode*> levels[2];
        int cur = 0;
        int next = 1;
        
        levels[cur].push(root);
        while( !levels[cur].empty() || !levels[next].empty() ){
            
            vector<int> temp;
            while( !levels[cur].empty() ){

                TreeNode* node = levels[cur].top();
                levels[cur].pop();
                temp.push_back(node->val);

                if(cur == 0){
                    if(node->left)
                        levels[next].push(node->left);
                    if(node->right)
                        levels[next].push(node->right);
                }
                else{
                    if(node->right)
                        levels[next].push(node->right);
                    if(node->left)
                        levels[next].push(node->left);
                }

            }
            
            res.push_back(temp);
            if( levels[cur].empty() ){
                    cur = 1 - cur;
                    next = 1- next;
            }

        }
    
        return res;
    }
};

ps:1.검지offer의 제목은 정말 너무 고전적이어서 두껍게 읽어야 한다. 한 번에 완전무결하게 만들 생각은 하지 마라. 이것은 불가능하다. 한 번 더 읽으면 자연히 한 번 더 읽을 수 있다는 깨달음이 생긴다.2. 보보 선생님 Leetcode 문제풀이,https://github.com/liuyubobobo/Play-Leetcode정말 회색으로 잘 썼어요. 닭으로서도 보보 선생님을 베낄 수밖에 없었어요.마지막으로 자신에게 한마디, 파이팅 오리!!!

좋은 웹페이지 즐겨찾기