
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/
์ด์ง ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ก์ ๋, ํธ๋ฆฌ์์ ์ฃผ์ด์ง ๋ ๋
ธ๋์ ๊ฐ์ฅ ๋ฎ์ ๊ณตํต ์กฐ์ (LCA)์ ์ฐพ์ผ์ญ์์ค.
๐LCA: "๊ฐ์ฅ ๋ฎ์ ๊ณตํต ์กฐ์์ ๋ ๋
ธ๋ P์ Q ์ฌ์ด์์ P์ Q๋ฅผ ์์์ผ๋ก์ T์์ ๊ฐ์ฅ ๋ฎ์ ๋
ธ๋๋ก ์ ์๋ฉ๋๋ค (๋
ธ๋ ์์ฒด๊ฐ ํ์์ด ๋ ์ ์์ต๋๋ค)."
๐ง์ ์ฝ ์กฐ๊ฑด
1. ๋
ธ๋์ ์: [2, 10^5]
-10^9 <= Node.val <= 10^93๊ณผ 4 ์กฐ๊ฑด์ p์ q๊ฐ ๊ฐ์ ๋ ธ๋์ผ ์ ์๊ณ p ๋๋ q ๋ ธ๋๋ง ์กด์ฌํ ์๋ ์๋ค๋ ์๋ฏธ๋ค.
๐ข๋ฌธ์ ์ ์กฐ๊ฑด์ด ์ต์ ๊ณตํต "์กฐ์ ๋ ธ๋" ์ฐพ๊ธฐ ์ด๊ธฐ ๋๋ฌธ์, BFS(levelOrder)๋ณด๋ค๋ dfs๋ก ์ฌ๊ท์ ์ผ๋ก p์ q๋ฅผ ์ฐพ์ ๋ค์, ๋ฆฌํดํด์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฐพ๊ณ ๊ณตํต ์กฐ์ ๋ ธ๋๋ฅผ ์ฐพ์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ dfs๊ฐ ๋ ํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ์๋ค.
๐์ค์ ๋ก, level์ ๋ฐ๋ฅธ ์ผ์ด์ค ๋ถ๋ฅ๋ฅผ ํด์ ํด์๋งต์ ์ฌ์ฉํ levelOrder๋ฅผ ๊ตฌํํด๋ดค๋๋ฐ, ์๊ฐ๋ณด๋ค ์์ธ ์ผ์ด์ค๋ค์ด ๋ง์๊ณ mapVisited<curNode.val, level> ์ด์ธ์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ์ ์ฅํด์ผ ํ๋ ๋ณ๋์ ๋ก์ง์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ณผ๊ฐํ๊ฒ ํฌ๊ธฐํ์๋ค.
public class LcaSolution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
// base condition
if (root == null) {
return null;
}
// p์ q ๋
ธ๋๋ฅผ ์ฐพ๋๋ค.
if (root == p) {
return p;
}
if (root == q) {
return q;
}
// p์ q๊ฐ ํน์ subtree์ ์กด์ฌํ๋ค๋ ๋ณด์ฅ์ด ์์ผ๋ฏ๋ก ๋ณ์ ์ถ๊ฐ
TreeNode findNode1 = lowestCommonAncestor(root.left, p, q);
TreeNode findNode2 = lowestCommonAncestor(root.right, p, q);
// p์ q๊ฐ ๋ค๋ฅธ subtree์ ์กด์ฌ
if ((findNode1 != null) && (findNode2 != null)) {
return root;
} // p์ q๊ฐ ๊ฐ์ subtree์ ์กด์ฌ
else if (findNode1 == null) {
return findNode2;
} else {
return findNode1;
}
}
}
lowestCommonAncestor(root.left, p, q)์ lowestCommonAncestor(root.right, p, q)๋ก 2๊ฐ์ ์ฌ๊ท ํจ์๋ฅผ ๊ตฌํํ ์ด์ ๋ ๋ฌธ์ ์์ binary tree, ์ฆ ์ฐจ์๊ฐ 2๊ฐ ์ดํ์ธ ํธ๋ฆฌ๋ผ๊ณ ๋ช
์ํ๊ธฐ ๋๋ฌธ์ด๋ค.๐์ด ๋ฌธ์ ๊ฐ ๋ฌป๊ณ ์๋ ๊ฒ์:
p์ q๊ฐ ๋ค๋ฅธ subtree์ ์กด์ฌํ๊ฑฐ๋ ๊ฐ์ subtree์ ์กด์ฌํ ๋, ์ด๋ฅผ ์ผ์ด์ค ๋ถ๋ฅํ ์ ์๋?
๐์ง์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๊ฐ๋ฉด์ ์ฝ๊ฒ ์ฐพ์ ์ ์์๋๋ฐ, ๋ค๋ฅธ subtree์ ์กด์ฌํ๋ฉด root๋ฅผ, ๊ฐ์ subtree์ ์์ผ๋ฉด depth๊ฐ ๋ฎ์ ๋
ธ๋๋ฅผ ๋ฆฌํดํ๋ฉด ๋๋๊น preorder๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ์ ๋์ ์กด์ฌํ๋ ๋
ธ๋๋ฅผ ๋ฆฌํดํ๋ฉด ๋๋ค.
preorder traversal์ ํ๋ฉด์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋, ์ด๋ ํ ํ์๋ฅผ ํ ๊ฒ์ธ๊ฐ?
๐์๋ preorder ํจ์ ํ
ํ๋ฆฟ์์๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋ ์ถ๋ ฅ์ ํ๊ฑฐ๋ ๊ฐ์ ์ ์ฅํ์ง๋ง, ์ฌ๊ธฐ์๋ if๋ฌธ์ผ๋ก root๊ฐ p ๋๋ q์ ๊ฐ์์ง๋ก ๊ฒ์ฌํ๋ ํ์๋ก ๋ณํํ์๋ค.
๋ก ์ ๋ฆฌํ ์ ์๋ค.