데이터 구조 - 트 리 (1): 트 리 의 디자인 취지 와 이 진 트 리 의 앞 순서, 중간 순서, 뒤 순서 옮 겨 다 니 기 (재 귀 와 순환 두 가지 버 전)
44147 단어 데이터 구조 와 알고리즘
조작 시간 복잡 도
알고리즘 설계
이 진 트 리
/**
* @author xyz
* @date 30/3/2019 10:57
* @description:
*/
public class BinaryTree<T> {
public T val;
public BinaryTree<T> left;
public BinaryTree<T> right;
public BinaryTree(T val) {
this.val = val;
}
}
/**
* :root -> left -> right
* @param root
*/
public void preTraversalRecursive(BinaryTree<Integer> root) {
if (root == null) {
return;
}
// root
System.out.print(root.val + ",");
// left
if (root.left != null) {
preTraversalRecursive(root.left);
}
// right
if (root.right != null) {
preTraversalRecursive(root.right);
}
}
순환 실현
// ( ) : , : , , ; ...
public void preTraversal(BinaryTree<Integer> root) {
Stack<BinaryTree<Integer>> stack = new Stack<>();
if (root == null) {
return;
}
stack.push(root);
while (!stack.isEmpty()) {
BinaryTree<Integer> current = stack.pop();
// root
System.out.print(current.val + ",");
// , , , ,
if (current.right != null) {
stack.push(current.right);
}
if (current.left != null) {
stack.push(current.left);
}
}
}
2. 중간 순서 옮 겨 다 니 기
/**
* :left -> root -> right
* @param root
*/
public void midTraversalRecursive(BinaryTree<Integer> root) {
if (root == null) {
return;
}
// left
if (root.left != null) {
midTraversalRecursive(root.left);
}
// root
System.out.print(root.val + ",");
// right
if (root.right != null) {
midTraversalRecursive(root.right);
}
}
순환 실현
public void midTraversal(BinaryTree<Integer> root) {
Stack<BinaryTree<Integer>> stack = new Stack<>();
//
Map<BinaryTree, Boolean> childIsInStack = new HashMap<>();
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
System.out.print(root.val);
return;
}
// right
if (root.right != null) {
stack.push(root.right);
}
// root
stack.push(root);
// left
if (root.left != null) {
stack.push(root.left);
}
childIsInStack.put(root, true);
while (!stack.isEmpty()) {
//
BinaryTree<Integer> current = stack.pop();
if (current.left == null && current.right == null) {
System.out.print(current.val + ",");
} else {
// current , ,
if (childIsInStack.get(current) == null) {
// , ,
if (current.right != null) {
stack.push(current.right);
}
// root
// root , :right -> root -> left, left
childIsInStack.put(current, true);
stack.push(current);
// left
if (current.left != null) {
stack.push(current.left);
}
} else {
System.out.print(current.val + ",");
}
}
}
}
3. 후 순 옮 겨 다 니 기
/**
* :left -> right -> root
* @param root
*/
public void postTraversalRecursive(BinaryTree<Integer> root) {
if (root == null) {
return;
}
// left
if (root.left != null) {
postTraversalRecursive(root.left);
}
// right
if (root.right != null) {
postTraversalRecursive(root.right);
}
// root
System.out.print(root.val + ",");
}
순환 실현
public void postTraversal(BinaryTree<Integer> root) {
Stack<BinaryTree<Integer>> stack = new Stack<>();
//
Map<BinaryTree, Boolean> childIsInStack = new HashMap<>();
if (root == null) {
return;
}
// root
stack.push(root);
// right
if (root.right != null) {
stack.push(root.right);
}
// left
if (root.left != null) {
stack.push(root.left);
}
childIsInStack.put(root, true);
while (!stack.isEmpty()) {
//
BinaryTree<Integer> current = stack.pop();
//
if (current.left == null && current.right == null) {
System.out.print(current.val + ",");
} else {
if (childIsInStack.get(current) == null) {
// root , , :root -> right -> left
// root ,
stack.push(current);
childIsInStack.put(current, true);
// , , ; ,
if (current.right != null) {
stack.push(current.right);
}
if (current.left != null) {
stack.push(current.left);
}
} else {
// ,
System.out.print(current.val + ",");
}
}
}
}
4. 차원 옮 겨 다 니 기
/**
* , O(N)
* @param root
*/
public void treeLevelTraversal(BinaryTree<Integer> root) {
if (root == null) {
return;
}
// FIFO
ArrayDeque<BinaryTree<Integer>> queue = new ArrayDeque<BinaryTree<Integer>>();
queue.offerLast(root);
while (!queue.isEmpty()) {
BinaryTree<Integer> ele = queue.pollFirst();
System.out.print(ele.val + ",");
if (ele.left != null) {
queue.offerLast(ele.left);
}
if (ele.right != null) {
queue.offerLast(ele.right);
}
}
}
public static void main(String[] args) {
BinaryTree<Integer> root = TreeBuilder.buildCommonTree();
BinaryTreeTraversal treeTraversal = new BinaryTreeTraversal();
// 4,3,1,2,5,6,7
System.out.println("pre: ");
treeTraversal.preTraversalRecursive(root);
System.out.println();
treeTraversal.preTraversal(root);
System.out.println();
// 1,3,2,4,6,5,7
System.out.println("mid: ");
treeTraversal.midTraversalRecursive(root);
System.out.println();
treeTraversal.midTraversal(root);
System.out.println();
// 1,2,3,6,7,5,4
System.out.println("post: ");
treeTraversal.postTraversalRecursive(root);
System.out.println();
treeTraversal.postTraversal(root);
System.out.println();
// 4,3,5,1,2,6,7
System.out.println("level: ");
treeTraversal.treeLevelTraversal(root);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.