두 갈래 나무 두 노드의 최근 공공 부모 노드를 구하는 두 가지 방법 (java 실현)
두 갈래 나무 두 노드의 가장 가까운 공공 부노드를 구하세요.
먼저 루트 노드가 두 노드에 있는 경로를 찾은 다음에 그 중의 한 경로를 해시 테이블에 추가한 다음에 다른 경로를 훑어보고 해시 테이블에 같은 경로가 있으면 되돌아오면 된다. 코드는 다음과 같다.
public static TreeNode lowestCommenAncestor(TreeNode root,TreeNode p,TreeNode q){
List<TreeNode> listP = getPath(root,p);
List<TreeNode> listQ = getPath(root,q);
HashSet<TreeNode> set = new HashSet<>();
for(int i = 0;i < listP.size();i ++)
set.add(listP.get(i));
for (int i = 0; i < listQ.size(); i++) {
if(set.contains(listQ.get(i)))
return listQ.get(i);
}
return null;
}
// root p
public static List<TreeNode> getPath(TreeNode root, TreeNode p){
List<TreeNode> list = new LinkedList<>();
isContainsNode(root, p,list);
return list;
}
// , List
public static boolean isContainsNode(TreeNode root, TreeNode p,List<TreeNode> list){
if(root == null)
return false;
if(root == p){
list.add(p);
return true;
}
else if(isContainsNode(root.left,p,list) || isContainsNode(root.right,p,list)){
list.add(root);
return true;
}
return false;
}
직접 귀속으로 해결하는 것은 이해하기 어렵지만 코드는 매우 간결하다.
public static TreeNode lowestCommenAncestor2(TreeNode root,TreeNode p,TreeNode q){
if(root == null || root == p || root == q)
return root;
TreeNode left = lowestCommenAncestor2(root.left,p,q);
TreeNode right = lowestCommenAncestor2(root.right,p,q);
if(left != null && right != null)
return root;
return left != null ? left : right;
}
테스트 코드는 다음과 같습니다.
public static void main(String[] args) {
//
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right = new TreeNode(3);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
//4 5
System.out.println(lowestCommenAncestor(root,root.left.left,root.left.right).val);
System.out.println(lowestCommenAncestor2(root,root.left.left,root.left.right).val);
//2 7
System.out.println(lowestCommenAncestor(root,root.left,root.right.right).val);
System.out.println(lowestCommenAncestor2(root,root.left,root.right.right).val);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.