반복 및 이진 트리 탐색의 재귀 탐색

이진 트리의 전순 주사 (재귀 버전) :

공공 의 ArrayList <정수> 중위 (TreeNode를 루트) { 
        ArrayList에 <정수> = 결과 새로운 ArrayList에 <정수> ();
        경우 (루트 == null이 ) {
              반환 결과; 
        } 
        (root.val)를 result.add; 
        중위 (root.left); + 
        중위 (root.right); 
        반환 결과를; 
    }    

 

주문 탐색 (재귀 버전)에서 이진 트리 :

 

공공 의 ArrayList <정수> 중위 (TreeNode를 루트) { 
        ArrayList에 <정수> = 결과 새로운 ArrayList에 <정수> ();
        경우 (루트 == null이 ) {
              반환 결과; 
        } 
        중위 (root.left); 
        (root.val) result.add; 
        중위 (root.right); 
        반환 결과를; 
    }

이진 트리 이후의 탐색 (재귀 버전) :

공공 의 ArrayList <정수> 중위 (TreeNode를 루트) { 
        ArrayList에 <정수> = 결과 새로운 ArrayList에 <정수> ();
        경우 (루트 == null이 ) {
              반환 결과; 
        } 
        중위 (root.left); 
        중위 (root.right); 
        (root.val) result.add; 
        반환 결과를; 
    }

재귀 버전 요약 :

당신이 노드 다른를 추가 할 경우 사실, 즉

선주문 순회 : 노드를 추가하기 전에 순환 첨가;

탐색 중위 : 재귀 사이의 노드 주위에 노드를 추가;

Postorder은 : 노드는 재귀 노드에 대한 뒤에 추가됩니다;

 

이진 트리의 전순 주사 (반복 버전) :

 
 
공공의 ArrayList <정수> 선주문 (TreeNode를 루트) { 
ArrayList에 <정수> = 새로운 결과의 ArrayList <정수> ();
스택 <TreeNode를> 스택 = 새로운 스택 <TreeNode를> ();
(루트 == NULL) {경우
반환 결과;
}
경우 (루트 = 널!) {
stack.push (루트);
(root.val) result.add;
루트 = root.left;
} 다른 {
루트 =) (stack.pop;
루트 = root.right;
}
결과를 반환;
}
 

이진 트리 탐색 순서 (반복 버전) :

공공 의 ArrayList <정수> 중위 (TreeNode를 루트) { 
        ArrayList에 <정수> = 결과 새로운 ArrayList에 <정수> (); 
        스택 <TreeNode를> 스택 = 새로운 스택 <TreeNode를> ();
        경우 (루트 == null이 ) {
              반환 결과; 
        } 
        동안 (루트! = null의 ||! stack.isEmpty ()) {
             경우 (루트! = null이 ) { 
                stack.push (루트); 
                루트 = root.left; 
            } 다른 {
                루트 = () stack.pop; 
                (root.val) result.add; 
                루트 = root.right; 
            } 
        } 
        리턴 결과; 
    }

 

이진 트리 (반복 버전)를 통과 한 후 :

그는 그렇게 생각하기 시작했다 가장 어려운 때이 이해하기 전에, 당신이 같은 주문 탐색의 앞에 그를 발견 할 것이다!

    공공 ArrayList를 <정수> postTreeNode (TreeNode를 루트) { 
        스택 <TreeNode를> midstack = 새로운 스택 <TreeNode를> (); 
        스택 <TreeNode를> = resultstack 새로운 스택 <TreeNode를> (); 
        ArrayList를는 <정수> = 결과 새로운 <정수>의 ArrayList를 ();
        동안 (루트! = null의 ||! midstack.isEmpty ()) {
             경우 (루트! = null이 ) { 
                midstack.push (루트); 
                (루트) resultstack.push; 
                루트 =  root.right;
            } 다른 { 
                루트 = midstack.pop (); 
                루트 = root.left; 
            } 
        } 
        동안 (resultstack.size ()> 0 ) { 
            TreeNode에 온도 = resultstack.pop (); 
            result.add (temp.val); 
        } 
        반환 결과를; 
    }

 

 

추천

출처www.cnblogs.com/frank9571/p/11963441.html