[프로그래머 코드 면접 가이드] 이진 트리의 문제 - 가장 큰 이진 검색 진 물 (트리 DP)를 찾아

문제의 의미

이진 트리의 헤드 노드에 주어진 알려진 값은 모든 노드에 대해 동일, 최대 포함 된 노드는 두 개의 포크 탐색 트리를 찾아 나무의 헤드 노드로 돌아갑니다.

문제 해결

  • postorder 과정에서 구현됩니다.
  • 단계 나열 DP 트리에 의해 해결 단계. 세 가지 유형의 가능성 : 가장 왼쪽 서브 트리, 가장 큰 우측 하위 트리가, 현재 노드가 트리의 루트입니다.
  • O의 시간 복잡도 (N)

트리 DP

전제를 사용하여

목표는 주제의 규칙을 해결하는 경우, 프로세스는 각각의 대답의 규칙에서 각 노드에서와 하위 트리의 루트 노드입니다 해결하고,의 특정 최종 답변 할 수 있습니다.

단계

  • 가능성. 루트, 왼쪽 하위 트리보기 오른쪽 하위 트리 포인트.
  • 그것은 존재하는 모든 레이어를 얻기 위해 필요한 변수를 나열합니다. 왼쪽 및 오른쪽 하위 트리를 통합합니다.
  • 작성하는 재귀 함수에서 : basecase, 재귀에 대해, 바닥에 모든 변수를 제공하기 위해 업데이트의 가능성을 결정합니다.

모든

어떻게 그것은 클래스의 서브 클래스 미해결되었습니다. 서브 클래스는 예이어야하며 주요 OJ 측정 할 때 인스턴스 아니었다?

코드

public class ReturnType{
    int min;//最小节点值
    int max;//最大节点值
    int maxSize;//最大BST树的大小
    Node maxRoot;//最大BST树的根节点
    
    ReturnType(int min,int max,int maxSize,Node maxRoot){
        this.min=min;
        this.max=max;
        this.maxSize=maxSize;
        this.maxRoot=maxRoot;
    }
}
public class Main {
    public static void main(String args[]) {
        //test
        Node root=new Node(10);
        Node node1=new Node(11);
        Node node2=new Node(14);
        Node node3=new Node(11);
        Node node4=new Node(15);
        root.left=node1;
        root.right=node2;
        node2.left=node3;
        node2.right=node4;
        
        int maxSize=getMaxBST(root).maxSize;
        System.out.println(maxSize);
    }
    
    public static ReturnType getMaxBST(Node root) {
        if(root==null) {
            return new ReturnType(Integer.MAX_VALUE,Integer.MIN_VALUE,0,null);
        }
        ReturnType lReturn=getMaxBST(root.left);
        ReturnType rReturn=getMaxBST(root.right);
        
        int min=getMin(root.val,lReturn.min,rReturn.min);
        int max=getMax(root.val,lReturn.max,rReturn.max);
        int maxSize=Math.max(lReturn.maxSize, rReturn.maxSize);
        Node maxRoot=maxSize==lReturn.maxSize?lReturn.maxRoot:rReturn.maxRoot;
        if(lReturn.maxRoot==root.left&&rReturn.maxRoot==root.right&&lReturn.max<root.val&&rReturn.min>root.val) {//
            maxSize=lReturn.maxSize+rReturn.maxSize+1;
            maxRoot=root;
        }
        return new ReturnType(min,max,maxSize,maxRoot);
    }
    
    private static int getMin(int... vals) {
        int min=Integer.MAX_VALUE;
        for(int val:vals) {
            if(val<min) {
                min=val;
            }
        }
        return min;
    }
    
    private static int getMax(int... vals) {
        int max=Integer.MIN_VALUE;
        for(int val:vals) {
            if(val>max) {
                max=val;
            }
        }
        return max;
    }   
}

추천

출처www.cnblogs.com/coding-gaga/p/10978987.html