소잡이--검지offer-이차 수색 나무와 양방향 체인 시계
3850 단어 LetCode 퀴즈
두 갈래 검색 트리를 입력하면 두 갈래 검색 트리를 정렬된 양방향 체인 테이블로 변환합니다.새 결점을 만들 수 없으며 트리에서 결점 포인터의 방향을 조정할 수 있습니다.
2. 문제 풀이의 방향
두 갈래 검색 트리를 쌍방향 체인 테이블로 바꾸는 것은 사실 중간 순서에 따라 두 갈래 트리를 훑어본 다음에 체인 테이블을 만드는 것이다. 이는 귀속과 비귀속 두 가지 방식으로 나눌 수 있다.
1. 귀속 방식
귀환 방식은 매번 귀환이 체인 시계의 머리 노드이기 때문에 새로운 요소를 추가하는 것은 체인 시계의 끝부분이고 현재 귀환이 체인 시계의 머리 노드이기 때문에 체인 시계를 끊임없이 좌우로 옮겨야 한다.
2. 비귀속 방식
창고 공간을 이용하여 해결하고 두 개의 TreeNode를 정의한다. 하나는 체인 테이블의 헤드 노드를 가리키고 다른 하나는 체인 테이블의 현재 노드 위치를 가리킨다.
코드
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//TreeNode root=null;
public TreeNode Convert(TreeNode pRootOfTree) {
//
if(pRootOfTree==null)
return pRootOfTree;
Stack stack=new Stack();
TreeNode result=null;//
TreeNode cur=null;//
while(!stack.empty() || pRootOfTree!=null){
while(pRootOfTree!=null){
stack.push(pRootOfTree);
pRootOfTree=pRootOfTree.left;
}
if(!stack.empty()){
TreeNode tmp=stack.pop();
if(result==null){
result=tmp;
cur=result;
}else{
cur.right=tmp;
tmp.left=cur;
cur=cur.right;
}
pRootOfTree=tmp.right;
}
}
return result;
/*
if(pRootOfTree==null)
return pRootOfTree;
// if(pRootOfTree.left==null && root==null){
// root=pRootOfTree;
// return pRootOfTree;
// }else if(pRootOfTree.left==null && root!=null)
// return pRootOfTree;
TreeNode left;
TreeNode right;
if(pRootOfTree.left==null)// ,left
left=pRootOfTree;
else{
// ,
left=Convert(pRootOfTree.left);
// , , pRootOfTree
while(left!=null && left.right!=null)
left=left.right;
left.right=pRootOfTree;
pRootOfTree.left=left;
left=left.right;
}
if(pRootOfTree.right==null){
while(left!=null && left.left!=null)
left=left.left;
return left;
}
right=Convert(pRootOfTree.right);
left.right=right;
right.left=left;
while(left!=null && left.left!=null)
left=left.left;
return left;
*/
}
}
다음은 귀속적인 방식으로 다시 실현된 것이다
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode head = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null)
return null;
TreeNode result = convertCore(pRootOfTree);
while(result.left != null)
result = result.left;
return result;
}
private TreeNode convertCore(TreeNode root){
if(root == null){
return null;
}
TreeNode left = convertCore(root.left);
TreeNode right = convertCore(root.right);
if(left != null){
while(left.right!=null){
left = left.right;
}
left.right = root;
root.left = left;
}
if(right != null){
while(right.left != null)
right = right.left;
right.left = root;
root.right = right;
}
return root;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 선착순 (귀속과 비귀속), 중착순 (귀속과 비귀속), 후착순 (비귀속) 및 차원 자바 구현두 갈래 나무의 순서가 반복되고 귀속 실현: 두 갈래 나무는 먼저 순서대로 옮겨다니며 비귀속 실현: 두 갈래 나무에서 순서를 옮겨다니며 귀속 실현: 두 갈래 나무의 중순으로 옮겨다니며 비귀속 실현: 두 갈래 나무의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.