소개
재귀 바이너리 자체가 생성되는 트리, 그래서 관련 문제를 해결하기 위해 시간이, 첫째 할 재귀를 사용하는 것입니다 ,
그러나, 시간과 공간 알고리즘의, 그래서 재귀 변환하려고 반복 할을 .
재귀 문제 해결 방안
재귀는 실행하는 과정에 자신의 전화 .
재귀 구성 조건이 있어야한다, :
1. 원래의 문제를 실행해야합니다 아이는
같은 일을
하고,
더 간단
;
2. 자체를 호출하지 무제한 수행
출구가 있어야합니다
, 비 재귀 처리를 위해 상황을 단순화합니다.
하이라이트 :
1. 먼저 할 일은 자신의 결정하는 가장 작은 단위를 하고 적어;
하위 문제가 원래 문제가 있는지 아이의 일을 같은 것을, 그래서 있기 때문입니다, 원래의 문제를 식별 할 것이다
2. 문제 아이 식별 종료 조건을 ;
이것은 재귀가 궁극적으로 말 할 필요가 있기 때문에 당신이 최소 단위를 결정해야하므로, 즉, 반환의 결과이다 (무엇을 반환) 결과를 반환 할 필요가
그리고 그는의 어떤 최종 조건 .
3. 방법의 원래의 질문 찾습니다 조건 방법의 하위 문제를 변환을 :
일반적으로 + B를 반환 A를 입력하는 등의 형태가있다
다음과 같이 따라서, 위의 단계가 요약되어 있습니다 : (프로그래밍 아이디어는 작은 문제를 찾기 위해 중지하는 방법 작은 문제는 작은 문제가 큰 문제를 설정 아래에서 위로 쓸 자아의 구현을 달성하기 위해 위에서 아래로)
재귀 케이스 :
이진 트리와 대상을 감안할 때이 노선에, 트리 경로의 리프 노드에 루트 노드가 있는지 여부를 모든 노드를 결정하고, 목표 값과 같은이 추가됩니다.
实现代码:
/ * * * 이진 트리 노드에 대한 정의. * 공용 클래스의 TreeNode { * INT의 발; * TreeNode에 남음; * TreeNode를 오른쪽; *의 TreeNode (INT의 X) {X = 브로; } *} * / 클래스 해결 { 공개 부울 hasPathSum (TreeNode를 루트 INT의 합) { INT의 카운트 = 0 ; 반환 preOder (루트, 수, 합계); } 개인 부울 preOder (TreeNode를 루트, INT의 합 INT는 예상) { 경우 (루트 == 널 (null) ) { 반환 거짓 ; } SUM + = root.val를 // . 1, 최소 단위를 수행 IF ( root.left == 널 && root.right == 널 ) { // 2 종단 상태 복귀 SUM == 예상; } || preOder은 (root.left는 SUM은 기대)를 호출 preOder는 (root.right는 SUM은 기대) /// . 3 서브 문제가 큰 문제 } }
비 재귀 아이디어