Lowest Common Ancestor of a Binary Tree

2021. 6. 26. 17:38· 자료구조 알고리즘/코딩테스트
목차
  1. 236. Lowest Common Ancestor of a Binary Tree
  2. References

236. Lowest Common Ancestor of a Binary Tree

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/

 

Lowest Common Ancestor of a Binary Tree - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

Language: C++

/**
 * 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:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        
        if (!root)
            return nullptr;
        else
           return helper(root, p->val, q->val);
        
    }
    
    TreeNode* helper(TreeNode* root, int p, int q) {
        
        if (!root)
            return nullptr;
        
        if (root->val == p || root->val == q)
            return root;
        
        TreeNode* left = helper(root->left, p, q);
        TreeNode* right = helper(root->right, p, q);
        
        if (left && right)
            return root;
        else
            return left ? left : right;
        
    }
};

시도

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        
        // search p, q
        // compare queue
        
    }
    
    queue<TreeNode* > search(TreeNode* root, TreeNode* node) {
        queue<TreeNode*> result;
        
        result.push(root);
        
        TreeNode* temp;
        temp = root;
        
        while (!result.isempty()) {
            result.push(temp);
            if (!searchHelper(temp, node->val))
                break;
            result.push(temp->left);
            if (!searchHelper(temp->left, node->val))
                break;
            result.pop();
            result.push(temp->right);
            if (!searchHelper(temp->right, node->val))
                break;
            result.pop();
            
        }
        
    }
    
    TreeNode* searchHelper(TreeNode* root, int val) {
        
        if (!root)
            return nullptr;
        
        if (root->val == val)
            return root;
        else
            return nullptr;
    
    }
    
};

문제점

첫번째 솔루션 글만 보고 뭔가 재귀로 풀고 찾으면 전달하는 식으로 풀면 되겠다 싶어서 

구조체도 만들고 했었는데 그냥 숫자로 반환해서 2이면 하는 걸로 했어도 되는 거였고(첫번째 솔루션)

솔루션이 세 개 있었는데 코드로도 이해 안되는 게 있어서  discussion 에서 다른 쉬운 해답을 보고

다시 보니까 좀 이해가 되었다

첫번째는 p나 q일 경우 true 를 넘기고 mid 라는 변수를 하나 더 놓아서 현재 노드가 p이거나 q 인지도 같이 본다.

타고타고 올라가서 1 + 1 + mid >= 2 이면 해당 노드가 LCA인 것

두번째는 각 노드의 부모 노드를 다 저장해놓고 비교하는 것이다. -> 원래 이렇게 하고 싶었는데 생각을 못했다.

나는 p의 경로 q의 경로 각각을 찾아서 비교하면서 보려고 했는데

스택이 존재할 때 노드를 도는데, 노드를 돌 때 새로운 자료구조에 각 노드의 자식들의 인덱스에 현재 노드(즉 부모노드) 를 넣어주고

스택에도 넣어주고.. 다 돌면 나와서 

p의 부모 값의 부모 값의 부모 값을 다 새로운 자료구조에 넣고 그 자료구조에서 q의 부모값과 돌아가면서 일치하는 것을 찾는다. 

세번째는 dfs 와 stack 을 이용하는 거.. 각종 상태값도 여러개 있는데 넘겼다.

 

References

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/discuss/1297527/C%2B%2B-oror-Easy-recursion

 

 

월요일부터 했으니까 지금 6일째인데, 쉬는 날 없이 매일 한다고 생각하니까 지치는데 약속을 하면 꼭 지켜야한다는 게 있어서 하고 있는데 내가 계속 너무 못하니까 흥미가 계속 떨어지는 듯? 하다. 솔루션 봐도 이해안될 때 노트북 덮을까 하다가 다른 해답 찾아서 이해되고, 결국 솔루션도 일부 이해하고 보면 내가 생각했던 게 아예 다른 방향은 아니였었고,, 하루를 보내면 너무 짧아서 하고 싶은 것은 많은데 몇 개를 마치면 하루가 저물기도 하고 나머지를 할 수 있는 체력이 남아있지가 않다. 골절 이후 하루에 걷기를 꾸준히 하려고 노력하고 있는데 근력운동도 조금씩 추가해야될 것 같은..

728x90
반응형

'자료구조 알고리즘 > 코딩테스트' 카테고리의 다른 글

Design Linked List  (0) 2021.06.29
Serialize and Deserialize Binary Tree  (0) 2021.06.27
Populating Next Right Pointers in Each Node II  (0) 2021.06.25
Populating Next Right Pointers in Each Node  (0) 2021.06.25
Construct Binary Tree from Preorder and Inorder Traversal  (0) 2021.06.23
  1. 236. Lowest Common Ancestor of a Binary Tree
  2. References
'자료구조 알고리즘/코딩테스트' 카테고리의 다른 글
  • Design Linked List
  • Serialize and Deserialize Binary Tree
  • Populating Next Right Pointers in Each Node II
  • Populating Next Right Pointers in Each Node
내공얌냠
내공얌냠
내공냠냠
내공얌냠
내공냠냠
내공얌냠
전체
오늘
어제
  • 분류 전체보기 (254)
    • 개발 (113)
      • mediapipe (16)
      • insightface (5)
      • JongjuAR (3)
    • 자료구조 알고리즘 (79)
      • 코딩테스트 (64)
      • 이론 (15)
    • 공부 (7)
      • 단행본 (7)
      • 튜토리얼 (19)
      • 논문 (15)
      • 복기 (5)
    • 참여 (5)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 음성인식 기초
  • 컴퓨터 비전 책 추천
  • 컴퓨터 비전
  • 머신러닝이란
  • 구글 미디어파이프
  • torchscript vs onnx vs tensorrt
  • flutter conference
  • mediapipe
  • kubeflow설치안됨
  • flutter 행사 후기
  • mediapipe translate
  • speaker adaptation tts
  • 플러터
  • kubeflow설치가이드
  • flutter
  • python telegrambot
  • flutter 행사
  • postgresql install in mac
  • vscode 스프링 설치
  • google mediapipe
  • ios google places api
  • 미디어파이프
  • git tutorial
  • 컴퓨터 비전 기초
  • 깃 튜토리얼
  • 플러터 튜토리얼
  • 음성인식 튜토리얼
  • postgresql 재설치
  • 딥러닝 기반 음성인식 기초
  • flutter tutorial

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
내공얌냠
Lowest Common Ancestor of a Binary Tree
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.