이진 트리의 전순 주사 (재귀 버전) :
공공 의 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); } 반환 결과를; }