これは、バイナリツリーなどの予約注文および順序性トラバーサルを介してバイナリツリーの階層トラバーサルを取得するなど、一般的なインタビューの質問です。
予約注文 +ミドルオーダー - >ビルド
次のように、バイナリツリーがあると仮定します。
この時点で、トラバーサル順序は次のとおりです。
予約注文:gdafemhz inorder:adefghmz postorder:aefdhzmg
次に、予約注文とインダージ(inorder)を指定し、バイナリツリーを作成するか、順序(inorder)と郵便(郵便順)を与え、バイナリツリーを作成します。実際には同じです
ツリーノードの定義:
class tree {char val; tree left; tree右成果を上げる:
public static Tree buildTree(char [] preorder、char [] inorder){//事前注文は事前注文シーケンス// inorderは中間シーケンスです(事前== null || null || length == 0){return null;}ツリールート= new Tree(Preorder [0]); for(char i = 0; i <inorder.length; i ++){if(inorder [i] == root.val){inorderIndex = i;}} //左のサブツリーと右のサブツリーpreorderLeft = arrays.copyofrange(preorder、1、1+inordidex); 1+inororderIndex、preorder.length); //左サブツリーおよび右サブツリーinorder char [] inorderleft = arrays.copyofrange(inorder、0、inorderindex); char [] inorder right = arrays.copyofrange(inorder、inorderindex+1、inorder.lengte); buildtree(preorderleft、inorderleft); tree rightchild = buildtree(preoderright、inorderright); root.left = leftchild; root = rightchild; return root;}実際には、ミドルオーダー +ポストオーダーを作成することも同じです。ここには書きません
さまざまなトラバーサル
郵便局所トラバーサル
public static void postorderprint(tree root){//後続のトラバーサル//左および右ルーツif(root.left!= null){postorderprint(root.left); } if(root.right!= null){postorderprint(root.right); } system.out.print(root.val + ""); }一例から学ぶと、順序は中央の順序と同じです。ここには書きません
層シーケンストラバーサル
キューキューキューを使用して、最初にキューにルートノードを追加できます。キューが空でない場合は、キューヘッドのノードノードを使用して、ノードのノード値を印刷します。ノードの左と右の子供が空でない場合は、左右の子供をキューに追加します。
public static void layerorderprint(tree root){if(root == null){return; } //レイヤーシーケンストラバーサルキュー<tree> qe = new linkedlist <tree>(); qe.add(root); while(!qe.isempty()){tree node = 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(ツリールート){//深い優先度トラバーサルは、トラバーサルを事前に注文することと同等です。 } system.out.print(root.val + ""); if(root.left!= null){deepfirstprint(root.left); } if(root.right!= null){deepfirstprint(root.right); }} public static void deepfirstprintnonerec(ツリールート){//深さ優先度トラバーサルの非再帰的形式(root == null){return; } stack <tree> st = new stack <tree>(); St.Add(root); while(!st.isempty()){tree node = st.pop(); System.out.print(node.val + ""); //スタックが戻って最初に外出します} if(node.left!= null){sterdd(node.left); }}}主な関数:
public static void main(string [] args){char [] preorder = "gdafemhz" .tochararray(); char [] inorder = "adefghmz" .tochararray();ツリールート= main.buildtree(事前注文、inorder); // main.postorderprint(root); // PostOrder Traversal // main.layerOrderPrint(root); //レイヤーシーケンストラバーサル// main.deepfirstprint(root); // Deep Priority Traversal // main.deepfirstprintnonerec(root); //深さfirstのトラバーサルの非再帰バージョン}要約します
上記は、バイナリツリーの確立とJavaのさまざまなトラバーサルインスタンスコードに関するものです。私はそれが誰にでも役立つことを願っています。興味のある友達は引き続きこのサイトを参照できます:
「 Javaプログラミングバイナリツリーの2つのミラーリング方法の紹介」
「 Java言語は、バイナリツリーの深さと幅を説明しています」
Javaバイナリツリーパスとコードの例
欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!