우객망_검지 Offer_04_전차 중차 재건 두 갈래 나무

1486 단어 offer 필수 문제

1. 제목 설명


두 갈래 나무의 앞 순서와 중간 순서의 결과를 입력하십시오. 이 두 갈래 나무를 다시 만드십시오.입력한 앞 순서와 중간 순서의 결과에 중복된 숫자가 없다고 가정하십시오.예를 들어 앞 순서 반복 시퀀스 {1,2,4,7,3,5,6,8}와 중간 순서 반복 시퀀스 {4,7,2,1,5,3,8,6}를 입력하면 두 갈래 트리를 재건하고 되돌려줍니다.
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

생각


1. 코드를 쓰기 전에 우리는 어떻게 전차순과 중차순에 따라 두 갈래 나무를 구축하고 수동으로 구축 과정을 시뮬레이션하는지 이해해야 한다
전차 서열의 첫 번째 노드는 반드시 루트 노드이다. 중차 역행 서열에서 이 루트 노드의 상응하는 위치pos를 찾으면pos의 왼쪽은 루트 노드의 왼쪽 트리,pos의 오른쪽은 루트 노드의 오른쪽 트리를 각각 역행하면 된다.
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root = reConstructBinaryTree(pre,in,0,pre.length-1,0,in.length-1);
        return root;
    }
    private TreeNode reConstructBinaryTree(int[] pre,int[] in,int preLeft,int preRight,int inLeft,int inRight){
        if(preLeft > preRight || inLeft > inRight)
            return null;
        TreeNode root = new TreeNode(pre[preLeft]);
        int i;
        for(i = inLeft;i < inRight && in[i] != pre[preLeft];i++);// 
        root.left = reConstructBinaryTree(pre,in,preLeft+1,preLeft+i-inLeft,inLeft,i-1);
        root.right = reConstructBinaryTree(pre,in,i-inLeft+preLeft+1,preRight,i+1,inRight);
        return root;
    }
}

본고는 주로 데이터 구조에서 나무에 관한 지식을 고찰하는데 저는 이 방법만 생각했습니다. 다른 방법이 있다면 토론을 환영합니다.

좋은 웹페이지 즐겨찾기