나무의 범람, 두 갈래 나무 재건

4292 단어
상세한 것은 jiyangg 참조.github.io (두 갈래 나무 모음집)
두 갈래 트리 노드:
class BinaryTreeNode {
    int val;
    BinaryTreeNode left;
    BinaryTreeNode right;

    public BinaryTreeNode(int val) {
        this.val = val;
    }
}

노드 작업 액세스

void visit(BinaryTreeNode node) {
    System.out.print(node.val + " ");
}

두 갈래 나무 노드 수

  • 빈 나무라면: 0으로 돌아갑니다
  • 빈 트리가 아닌 경우: 노드 수 = (왼쪽 트리 노드) + (오른쪽 자수 노드) + 1
  • int TreeNodeCount(BinaryTreeNode root) {
        if (root == null) {
            return 0;
        }
        return TreeNodeCount(root.left) + TreeNodeCount(root.right) + 1;
    }

    두 갈래 나무의 깊이를 구하다

  • 빈 나무라면: 0으로 돌아갑니다
  • 빈 트리가 아닌 경우: 깊이 = Max(왼쪽 트리 깊이, 오른쪽 트리 깊이) + 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);
    }

    앞차례 를 두루 다니다

  • 빈 나무라면:return
  • 빈 나무가 아니라면: 뿌리->왼쪽->오른쪽
  • void preOrderTraverse(BinaryTreeNode root) {
        if (root == null) {
            return;
        }
        visit(root);                    // 
        preOrderTraverse(root.left);    // 
        preOrderTraverse(root.right);   // 
    }

    중서 역행

  • 빈 나무라면:return
  • 빈 나무가 아니라면 왼쪽->뿌리-오른쪽
  • void inOrderTraverse(BinaryTreeNode root) {
        if (root == null) {
            return;
        }
        inOrderTraverse(root.left);     // 
        visit(root);                    // 
        inOrderTraverse(root.right);    // 
    }

    뒤돌아 다니다

  • 빈 나무라면:return
  • 빈 나무가 아니라면 왼쪽->오른쪽->뿌리
  • 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;
    }

    좋은 웹페이지 즐겨찾기