두 갈래 나무의 BST 여부를 판단하다
함수를 실현하여 두 갈래 나무가 두 갈래인지 확인하십시오.트리의 루트 결점 포인터인 TreeNode*root를 지정합니다. 이 트리가 두 갈래인지 아닌지를 나타내는 bool로 돌아가십시오.
2. 생각:
해법1: 뿌리 노드에서부터 두 갈래 나무를 훑어본다. 그 중에서 차례대로 노드를 훑어보고 뿌리의 좌우 노드의 값과 뿌리 노드의 값의 크기를 판단해야 한다. 그 중에서 차례대로 돌아가는 사고방식은 만약에 나무가 왼쪽 나무가 있다면 우리는 왼쪽 나무, 오른쪽 나무가 있으면 오른쪽 나무, 왼쪽 나무가 있으면 우리는 왼쪽 나무를 훑어보고 잎 노드가 될 때true로 돌아가면 된다.위의 판단을 제외하고는 부족하기 때문에 왼쪽 트리에서 가장 큰 노드 값이 루트 노드의 값보다 작고, 오른쪽 트리에서 가장 작은 노드의 값이 루트 노드의 값보다 큰지 판단해야 한다.
해법2: 우선 우리가 생각한 것은 두 갈래 나무에서 차례대로 훑어본 결과가 질서정연하다는 것이다. 이 결과에 따라 우리는 두 갈래 나무를 차례대로 훑어보고 그 결과를 한 수조에 저장한 다음에 이 수조의 크기가 질서수조인지 아닌지를 판단할 수 있다. 만약에 질서수조라면 두 갈래로 나무를 찾을 수 있다. 그렇지 않으면 그렇지 않다.이 방법의 시간 복잡도는 O(N)이지만 공간 복잡도가 비교적 높아 O(N)의 저장 공간을 낭비해야 한다.
import java.util.ArrayList;
public class CheckBST1 {
//
public boolean checkBST(TreeNode root) {
if (root == null)
return false;
ArrayList list = new ArrayList<>();
inorder(root, list);
return checkOrdered(list);
}
//
private void inorder(TreeNode node, ArrayList list) {
if (node == null)
return;
if (node.left != null) {
inorder(node.left, list);
}
list.add(node.val);
if (node.right != null) {
inorder(node.right, list);
}
}
// , , , false
private boolean checkOrdered(ArrayList list) {
for (int i = 0; i < list.size() - 2; i++) {
if (list.get(i) > list.get(i + 1))
return false;
}
return true;
}
public static class TreeNode {
public T val;
public TreeNode left = null;
public TreeNode right = null;
public TreeNode parent = null;
public TreeNode(T val) {
this.val = val;
}
}
}
해법 3: 전역 변수는 이전 값을 기록하고 현재 값은 이전 값보다 커야 합니다.조건을 충족시키면pre를 현재 값으로 업데이트합니다.
1 public class CheckBST2 {
2 public boolean checkBST(TreeNode root) {
3 if (root == null)
4 return true;
5
6 // , bst false
7 boolean leftIsBST = checkBST(root.left);
8 if (!leftIsBST)
9 return false;
10 // , false
11 if (root.val <= preValue) {
12 return false;
13 }
14 // ,
15 preValue = root.val;
16 return checkBST(root.right);
17 }
18
19 private int preValue = Integer.MIN_VALUE;
20
21 public static class TreeNode {
22
23 public T val;
24 public TreeNode left = null;
25 public TreeNode right = null;
26 public TreeNode parent = null;
27
28 public TreeNode(T val) {
29 this.val = val;
30 }
31
32 }
33 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.