어떻게 두 갈래 나무 두 노드의 최근 공공 양친을 찾습니까?

두 갈래 나무 중 두 노드의 최근 공공 양친(Lowest Common Ancestor)은 이 두 노드의 양친 노드 중 뿌리 노드에서 가장 먼 노드이다. 만약에 그 노드가 다른 노드의 양친 노드라면 이 정의에 부합되는 노드가 바로 이 양친 노드이다. 임의의 두 노드의 최근 공공 양친 노드를 어떻게 신속하고 간단하게 찾을 수 있는지가 여기서 토론하고자 하는 화제이다.
우선 이 문제를 구체화하자. 만약에 주어진 나무가 두 갈래로 나무를 찾는다면 이 나무의 일부 성질은 우리가 사용할 수 있을 것이다.코드 보기:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
     
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val>p.val && root.val>q.val) return lowestCommonAncestor(root.left,p,q);
        else if(root.valval && root.valval) return lowestCommonAncestor(root.right,p,q);
        else return root;
    }
}

이 코드에서 인용에 필요한 판정이 되지 않았음을 주의하고, 퇴고한 후에야 이 위험해 보이는 동작이 사실은 안전하다는 것을 발견하였다.우리는 범위를 두 갈래 찾기 나무로 한정했기 때문에, 만약에root.val>p.val && root.val>q.val 이 조건이 성립된 것은 이 루트 노드가 반드시 왼쪽 나무가 있다는 것을 의미하기 때문에 루트를 인용한다.left는 안전합니다. 같은 이치로 다음 판단 문장을 검사할 수 있습니다.
이어서 우리는 광범위한 의미의 LCA 문제를 토론하고 코드를 보았다.
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
     
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if( root == p || root == q || root == null)
            return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        // we found nodes in both the sides, so return root.
        if( left != null && right != null )
            return root;
        return ( left != null )? left : right;
    }
}

마지막 부분은 더욱 세련되게 통합할 수 있다.
return left == null ? right : right == null ? left : root;

이 코드는 논리적으로 두 갈래 나무 전체를 훑어보는 역할을 포함하고 훑어보는 결과를 기록함으로써 노드 간의 관계를 무너뜨리는 사고방식도 교묘하다.
이 문제는 LeetCode OJ - lowest-common-ancestor-of-a-binary-tree - lowest-common-ancestor-of-a-binary-search-tree에서 나왔습니다.

좋은 웹페이지 즐겨찾기