나무의 범람, 두 갈래 나무 재건
두 갈래 트리 노드:
class BinaryTreeNode {
int val;
BinaryTreeNode left;
BinaryTreeNode right;
public BinaryTreeNode(int val) {
this.val = val;
}
}
노드 작업 액세스
void visit(BinaryTreeNode node) {
System.out.print(node.val + " ");
}
두 갈래 나무 노드 수
int TreeNodeCount(BinaryTreeNode root) {
if (root == null) {
return 0;
}
return TreeNodeCount(root.left) + TreeNodeCount(root.right) + 1;
}
두 갈래 나무의 깊이를 구하다
int TreeDepth(BinaryTreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = TreeDepth(root.left);
int rightDepth = TreeDepth(root.right);
return leftDepth > rightDepth ? (leftDepth + 1) : (rightDepth + 1);
}
앞차례 를 두루 다니다
void preOrderTraverse(BinaryTreeNode root) {
if (root == null) {
return;
}
visit(root); //
preOrderTraverse(root.left); //
preOrderTraverse(root.right); //
}
중서 역행
void inOrderTraverse(BinaryTreeNode root) {
if (root == null) {
return;
}
inOrderTraverse(root.left); //
visit(root); //
inOrderTraverse(root.right); //
}
뒤돌아 다니다
void postOrderTraverse(BinaryTreeNode root) {
if (root == null) {
return;
}
postOrderTraverse(root.left); //
postOrderTraverse(root.right); //
visit(root); //
}
레이어 반복 (위에서 아래로, 왼쪽에서 오른쪽)
void levelTraverse(BinaryTreeNode root){
if (root == null) {
return;
}
Queue queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
BinaryTreeNode node = queue.poll();
visit(node);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
두 갈래 나무를 재건하다
앞 순서와 중간 순서의 결과에 따라 두 갈래 나무를 재건하다
앞의 순서대로 훑어보는 첫 번째 원소를 통해 나무의 뿌리를 찾은 다음에 중간에서 뿌리 노드의 위치를 찾으면 나무의 좌우 서브 나무의 노드 수를 확정할 수 있다.
BinaryTreeNode reConstructBinaryTree(int[] pre, int[] in) {
if (pre == null || in == null || pre.length <= 0 || in.length <= 0) {
return null;
}
//
BinaryTreeNode root = new BinaryTreeNode(pre[0]);
int rootPositionInOrder = -1;
//
for (int i = 0; i < in.length; i++) {
if (root.val == in[i]) {
rootPositionInOrder = i;
break;
}
}
if (rootPositionInOrder == -1) {
return null;
}
//
int numOfLeft = rootPositionInOrder;
//
int[] leftPre = new int[numOfLeft];
for (int i = 0; i < numOfLeft; i++) {
leftPre[i] = pre[i + 1];
}
//
int[] leftIn = new int[numOfLeft];
for (int i = 0; i < numOfLeft; i++) {
leftIn[i] = in[i];
}
//
root.left = reConstructBinaryTree(leftPre, leftIn);
//
int numOfRight = in.length - numOfLeft - 1;
//
int[] rightPre = new int[numOfRight];
for (int i = 0; i < numOfRight; i++) {
rightPre[i] = pre[i + numOfLeft + 1];
}
//
int[] rightIn = new int[numOfRight];
for (int i = 0; i < numOfRight; i++) {
rightIn[i] = in[i + numOfLeft + 1];
}
//
root.right = reConstructBinaryTree(rightPre, rightIn);
return root;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.