이것은 바이너리 트리의 선주문 및 사역 순서를 통해 이진 트리의 계층 적 트래버스를 얻는 것과 같은 일반적인 인터뷰 질문입니다.
선주문 + 중간 주문 -> 빌드
다음과 같이 이제 이진 트리가 있다고 가정합니다.
이때 트래버스 순서는 다음과 같습니다.
선주문 : gdafemhz inorder : adefghmz postorder : aefdhzmg
이제 선주문과 사고 (인더)를 제공하고, 이진 트리를 만들거나, 선거소 (인더) 및 포스트 주문 (우편 주문)을 제공하고 이진 트리를 만듭니다. 실제로 동일합니다.
트리 노드의 정의 :
클래스 트리 {char val; 나무 왼쪽; 나무 오른쪽; 나무 (char val, 나무 왼쪽, 나무 오른쪽) {this.val = val; this.left = left; this.right; 오른쪽;} tree () {} tree (char val) {this.val = val; this.left = null; this.right = null;}}성취 :
public static tree buildtree (char [] preatorder, char [] inorder) {// 선주문은 선주문 시퀀스입니다. // inorder는 중간 시퀀스입니다. for (char i = 0; i <inorder.length; i ++) {if (inorder [i] == root.val) {inorderIndex = i;}} // 왼쪽 하위 트리 및 오른쪽 하위 트리 부분 [] preorderleft = arrays.copyofrange (preorder, 1, 1+inorder right); 1+inorderIndex, preorder.length); // 왼쪽 하위 트리 및 오른쪽 서브 트리의 inorder char [] inorderleft = arrays.copyofrange (inorder, 0, inor buildTree (preorderLeft, inorderLeft); tree rightchild = buildTree (preorderright, inorderright); root.left = leftChild; Root.right = Rightchild; return root;}실제로 중간 주문 + 후 주문을 만드는 것은 동일합니다. 나는 여기에 쓰지 않을 것입니다
다양한 횡단
주문 후 순서
public static void postorderprint (트리 루트) {// 후속 횡단 // 왼쪽 왼쪽 및 오른쪽 루트 if (root.left! = null) {postorderPrint (root.left); } if (root.right! = null) {postorderPrint (root.right); } system.out.print (root.val + ""); }한 예에서 배우고 순서는 중간의 순서와 동일합니다. 나는 여기에 쓰지 않을 것입니다
층 시퀀스 트래버스
큐 큐 큐를 사용하여 먼저 큐에 루트 노드를 추가 할 수 있습니다. 큐가 비어 있지 않으면 큐 헤드의 노드 노드를 가져 와서 노드의 노드 값을 인쇄하십시오. 노드의 왼쪽과 오른쪽 어린이가 비어 있지 않으면 왼쪽과 오른쪽 어린이를 대기열에 추가하십시오.
public static void LayerOrderPrint (트리 루트) {if (root == null) {return; } // 계층 시퀀스 트래버스 큐 <retre> qe = new LinkedList <tree> (); qe.add (루트); while (! qe.isempty ()) {트리 노드 = qe.poll (); System.out.print (node.val + ""); if (node.left! = null) {qe.add (node.left); } if (node.right! = null) {qe.add (node.right); }}}깊이와 폭의 우선 순위
사실, 그것은 단지 다른 말입니다. 깊이 우선 순위는 선주문 트래버스이며 폭이 우선 순위는 레이어 주문 트래버스입니다.
public static void deepfirstprint (tree root) {// 딥 우선 순위 트래버스는 선주문 트래버스와 동일하므로 (root == null) {return; } system.out.print (root.val + ""); if (root.left! = null) {deepfirstprint (root.left); } if (root.right! = null) {deepfirstprint (root.right); }} public static void deepfirstprintnonerec (트리 루트) {// 비 수수적인 형태의 깊이 우선 순위 트래버스 if (root == null) {return; } stack <tree> st = new Stack <tree> (); St.Add (루트); while (! st.isempty ()) {tree node = st.pop (); System.out.print (node.val + ""); // 스택이 다시 들어와 먼저 꺼져 // 오른쪽 자식을 먼저 추가 한 다음 왼쪽 자식을 추가 한 다음 (node.right! = null) {st.add (node.right); } if (node.left! = null) {st.add (node.left); }}}주요 기능 :
public static void main (String [] args) {char [] preorder = "gdafemhz".tochararray (); char [] inorder = "adefghmz".tochararray (); 트리 루트 = main.buildtree (선주문, 내부); // main.postorderPrint (루트); // postorder traversal // main.layerorderPrint (루트); // 계층 시퀀스 트래버스 // main.deepfirstprint (루트); // Deep Priority Traversal // main.deepfirstprintnonerec (루트); // 깊이 우선 Traversal의 비수체 버전}요약
위의 모든 것은 바이너리 트리의 설립과 Java의 다양한 횡단 인스턴스 코드에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
" 자바 프로그래밍 바이너리 트리에서 두 가지 미러링 방법 소개 "
" 자바 언어는 이진 트리의 깊이와 너비를 설명합니다 ."
Java 이진 트리 경로 및 코드 예제
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!