두 갈래 나무가 두루 다니고 재건되다

2305 단어
1 두 갈래 나무 2 두 갈래 나무의 반복 3 두 갈래 나무의 재건 4 코드 구현

1, 두 갈래 나무


컴퓨터 과학에서 두 갈래 나무는 매 결점마다 최대 두 개의 자목이 있는 나무 구조이다.보통 서브트리는'왼쪽 서브트리'(left subtree)와'오른쪽 서브트리'(right subtree)라고 불린다.두 갈래 나무는 두 갈래 찾기 나무와 두 갈래 더미를 실현하는 데 자주 쓰인다.
깊이가 k이고 2^k-1개의 노드가 있는 두 갈래 나무를 만 갈래 나무라고 부른다.이런 나무의 특징은 각 층의 노드 수가 최대 노드 수라는 것이다.그러나 한 그루의 두 갈래 나무 중에서 마지막 층을 제외하고 나머지 층이 모두 가득 차고 마지막 층이나 가득 차거나 오른쪽에 연속적인 몇 개의 노드가 부족하면 이 두 갈래 나무는 완전한 두 갈래 나무이다.n개의 노드가 있는 완전한 두 갈래 나무의 깊이는log2(n+1)이다.깊이가 k인 완전 두 갈래 나무는 적어도 2k-1개의 노드가 있고 많게는 2k-1개의 노드가 있다.

2 두 갈래 나무의 두루 다니기


아래 링크는 상세하게 적혀 있다
http://blog.csdn.net/xiaotan2011929/article/details/61427919 http://blog.csdn.net/Dean_Deng/article/details/47053231 http://blog.csdn.net/u014744118/article/details/50983826

3 두 갈래 나무의 재건


아래 링크는 상세하게 쓰여 있습니다.https://www.jianshu.com/p/07ac60fd2e5c http://blog.csdn.net/lemon_tree12138/article/details/49798221
중차순 + 후차순 재구성https://blog.csdn.net/wu2304211/article/details/54709205

4 코드 구현


4.1 알고리즘 사고방식: 먼저 중차적 반복과 선차적 반복이 같은 값을 찾고 이 값의 좌표는 왼쪽 트리이고 오른쪽은 오른쪽 트리이며 순환은 이 알고리즘에 귀속되면 구축을 완성할 수 있다.


단계는 다음과 같습니다.
  • 나무의 좌우 트리 확인: 중차 트리와 선차 트리가 같은 값을 찾아 좌우 트리 확인..
  • 좌우자수 확인 방법:
  • 왼쪽 트리 범위 먼저 훑어보기 = 왼쪽 트리 시작 노드 좌표 + 1, 왼쪽 트리 범위 + 왼쪽 트리 범위 먼저 훑어보는 시작점 위치(이것이 주요한 점)
  • 오른쪽 트리 범위를 먼저 훑어본다 = 왼쪽 트리 범위를 중순으로 훑어본다 + 먼저 훑어보는 시작점 위치 + 1, 오른쪽 트리 끝 노드를 먼저 훑어본다
  • 중서 왼쪽 트리 범위 역행 = 중서 역행 왼쪽 트리 시작점 좌표, 중서 역행 왼쪽 트리의 끝 노드(즉 i: 좌우 트리 구분)-1;
  • 중서 오른쪽 트리 범위 = 중서 왼쪽 트리의 끝 노드(즉 i: 좌우 트리로 나누기) + 1, 중서 오른쪽 트리 끝 노드를 반복합니다
  • 대응 코드는 다음과 같다
  • private static TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
    
            if (startPre > endPre || startIn > endIn)
                return null;
            TreeNode root = new TreeNode(pre[startPre]);
    
            for (int i = startIn; i <= endIn; i++)
                if (in[i] == pre[startPre]) {
                    root.left = reConstructBinaryTree(pre, startPre + 1, i - startIn + startPre, in, startIn, i - 1);
                    root.right = reConstructBinaryTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);
                    break;
                }
            return root;
        }
    

    END

    좋은 웹페이지 즐겨찾기