最初の非再帰的なJava実装は、バイナリツリー再帰幅優先トラバーサルシーケンスモードのバイナリツリートラバーサルを作成した後

肌のデータアウト1.data

2.ツリー構造を実現するために、 

3. GETホールドツリーノードクラス

4.java配列データとLinkedListの木を達成

まったくと再帰と非再帰的にこのようなものの内容の出力ノード

再帰的手法

再帰的な技術を飛びます

幅優先、深さ優先

6.コール

7.ログイン:

利点

 

1.data搞了皮数据
のString [] DATAS =新しいString [] { "A"、 "B"、 "D"、 "E"、 "F"、 "G"、 "H"、 "I"、 " J」}。
若しくは

INT [] DATAS =新しいINT [ ] {1,2,3,4,5,6,7,8,9};
データは言うLINKLISTへのデータの後

 

2.ツリー構造は、このようなものの下に実現されている
A
B C
D EFG
HIJ
または

    1
 2    3

5. 6. 7. 4
。8 9 10
上側の効果このようなもののうち

 

3. GETホールドツリーノードクラスすごい
//ノードクラスの
クラスノード{
String型VAR; //ノード値
ノードが左; //の左の子ノード
の右ノード; //右の子ノード

    public Node(String var) {
        this.var = var;
        this.left = null;
        this.right = null;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public void setRight(Node right) {
        this.right = right;
    }

    public String getVar() {
        return var;
    }

    public void setVar(String var) {
        this.var = var;
    }

    public Node getLeft() {
        return left;
    }

    public Node getRight() {
        return right;
    }

}

このようなものは、現在のノードです
左の子が現在である
現在の右の子
ツリーと、ツリーChaziの両方を達成するために、主に
も、ルートノードとして、及び2本のフォークでツリーを追加するには時間が
、ビットイテレータパターンのようなトラバーサルは、再帰的であるか、ループしながら、子フォークアウト値を探しているとき
 

配列のLinkedListによって達成4.javaツリーデータ 
/ **

  • @param日
  • アレイそのバイナリ値の各ノード
  • @paramノードリスト
  • バイナリツリーリスト
    /
    プライベートボイドcreatBinaryTree(文字列[] DATAS、リストの<node>のNodeList){
    //ノードがノードアレイとなる
    ため(INT nodeindex = 0; nodeindex <datas.length; nodeindex ++){// LINKLISTにデータを追加しますで
    、新しい新しい=ノード(DATAS [nodeindex])ノードノード
    nodelist.add(ノード);
    }
    //親ノードのすべての子ノードに設定する
    (INTインデックス= 0、インデックス <nodelist.size()/ 2から1。 インデックス++){//設定親子ノード
    nは彼の左の子ノード番号の//数は2である
    n個右の子ノード番号2 のn + 1が、リストから番号0、そうも1から始まるから
    、ここで//親をノード1(3)、2(4,5)、3(6,7)4(8,9)が、最後の親ノードが右の子ノードのプロセスを有していなくてもよいが、別個必要
    nodelist.get(インデックス)。 setLeft(nodelist.get(指標
    2 + 1));
    nodelist.get(インデックス).setRight(nodelist.get(指標2 + 2));
    }
    //最後に、その親ノードの別々の処理は、右の子ノードではないかもしれません
    INTインデックス= nodelist.size()/ 2 - 1; // 取得最後のビットが右の子ノード内の奇数偶数なしに、純粋になりている場合、ノードが決定
    nodelist.get(インデックス).setLeft(nodelist.get(指標
    2 + 1。 )); //左の子ノードを設定する
    場合(nodelist.size()%2 == 1){// ノードの奇数がある場合、親ノードは、最終的に右の子ノード有し
    nodelist.get(インデックス).setRightを( nodelist.get(指数* 2 + 2));
    }
    }
    このことは、LinkedListの用にデータの配列を作成することである
    LinkedListのツリーとして見える 
    実装
    に配置された1 LinkedListのノード
    左右のサブデータ2へのノード(最後のホールド)
    3 SITはノードに最後のPUTを決定する(この動作多くても1つは、ほとんどが2つのフォーク場合、奇数、フォークの偶数あるなければならない)
     
    出力ノードのコンテンツ再帰と非再帰的にすべてとでこのようなもの
    / **
  • 現在のノードの値を横切ります
  • ノード@param
    * /
    {公共ボイドcheckCurrentNode(ノードノード)
    System.out.printの(node.getVar()+ "");
    }
    現在のコンテンツノードから取得します
     

再帰的手法

/**
 * 先序遍历二叉树
 * @param root 二叉树根节点
 */
public void preOrderTraversal(Node node){
    if (node == null)  //很重要,必须加上 当遇到叶子节点用来停止向下遍历
        return;  
    checkCurrentNode(node);
    preOrderTraversal(node.getLeft());
    preOrderTraversal(node.getRight());
}
/**
 * 中序遍历二叉树
 * @param root 根节点
 */
public void inOrderTraversal(Node node){
    if (node == null)  //很重要,必须加上
        return;  
    inOrderTraversal(node.getLeft());
    checkCurrentNode(node);
    inOrderTraversal(node.getRight());
}
/**
 * 后序遍历二叉树
 * @param root 根节点
 */
public void postOrderTraversal(Node node){
    if (node == null)  //很重要,必须加上
        return;  
    postOrderTraversal(node.getLeft());
    postOrderTraversal(node.getRight());
    checkCurrentNode(node);
}

道の出力を行うにはとき

前と再帰的なノードの内容を変更した後、それは道を横断した後、前に実現されています

再帰的な技術フライ
/ **

  • 予約注文・トラバーサル非再帰
  • ノード@param
    * /
    パブリック無効preOrderTraversalbyLoop(ノードノード){
    スタック<ノード> =新しい新しいスタックスタック();
    ノードノード= P;
    しばらく(!= nullの|| stack.isEmpty P()){
    しばらく(P =! NULL){Pが空でない場合//、それはpの値を読み取り、そしてpは連続左の子ノードとして更新され、即ち、左の子ノードを連続読み出し
    checkCurrentNode(p)を、
    stack.push(P); //プッシュPは
    P = p.getLeft();
    }
    IF {(stack.isEmpty()!)
    P = stack.pop();
    P = p.getRight();
    }
    }
    }
    / **
  • 非再帰予約限定!
  • @paramノード
    * /
    公共ボイドinOrderTraversalbyLoop(ノードノード){
    スタックの<node>スタック=新しいスタック()。
    ノードP =ノード。
    (!p = NULL || stack.isEmpty()){一方
    ながら(!p = NULL){
    stack.push(P)。
    P = p.getLeft()。
    }
    IF(!stack.isEmpty()){
    P = stack.pop()。
    checkCurrentNode(P)。
    P = p.getRight()。
    }
    }
    }
    / **
  • 非再帰前順後
  • @paramノード
    * /
    公共ボイドpostOrderTraversalbyLoop(ノードノード){
    スタックの<node>スタック=新しいスタック<>();
    ノードp =ノード、PREV =ノード。
    (!p = NULL || stack.isEmpty()){一方
    ながら(!p = NULL){
    stack.push(P)。
    P = p.getLeft()。
    }
    IF(!stack.isEmpty()){
    ノードTEMP = stack.peek()GetRightの()。
    IF(TEMP == NULL || TEMP == PREV){
    P = stack.pop()。
    checkCurrentNode(P)。
    PREV = P;
    P = NULL;
    }他{
    P = TEMP。
    }
    }
    }
    }
     
    广度优先、深度优先

    / **

  • (上から二分木の底トラバーサルに)幅優先トラバーサル
  • ルート@param
    * /
    パブリック無効BFS(ノードルート){
    IF(ルート== null)のリターン;
    LinkedListは<ノード> =新しい新しいキューのLinkedList <ノード>();
    Queue.offer(ルート); //ルートノードを保存するには、最初にキュー
    値は、除去キューの各ノードプリントヘッド、印刷ノードに子ノードがあるかどうかを決定した後、もしあれば、子ノードのキューに追加されるであろうがある//キュー
    一方(queue.size()> 0){
    ノード= queue.peekノードを();
    queue.poll(); //キュー要素のヘッドを取り外し、印刷
    System.out.print(node.var + "を");
    IF(!node.left = NULL){//左場合子ノードは、それがキューに格納されている
    。Queue.offer(node.left)
    }
    IF(node.right = NULL!){//右の子ノードは、それがキューに格納されている場合
    queue.offer(node.rightを);
    }
    }
    }
    / **
  • 深さ優先探索
  • @paramノード
  • @param RST
  • リスト@param
    /
    公共ボイドDFS(ノードノード、リスト<リスト<整数>> RST、リスト<整数>リスト){
    IF(ノード== NULL)のリターン;
    IF(node.left == == NULL && node.right NULL){
    List.add(node.var);
    /
    リストを保存した場合、ここでは、RST、リストは、直接格納できないが、新しいリストにより達成されます
    • リストを直接使用する場合は、その後、後で時間が格納* /削除する最後のノードになります取り除くため
      rst.add(新しい新しいのArrayList <>(リスト));
      list.remove(はlist.size() - 1);
      }
      List.add(node.var);
      (node.left、RST、リスト)DFS、
      DFS(node.right、RST、LIST);
      list.remove(はlist.size() - 1);
      }
      幅優先トラバーサル:
      ABDEFGHIJの 
      深さ優先トラバーサル
      : [A、B、E、I]、[A、B、E、J]、[A、B、F.]、[A、D、G]、[A、D、H]

 

tree.inOrderTraversalbyLoop(ルート)。System.out.println();


















System.out.println( "ポスト順序トラバーサル再帰:");
tree.postOrderTraversal(ルート)
のSystem.out.println();
System.out.printlnは( "非再帰的トラバーサル順序:");
tree.postOrderTraversalbyLoop(ルート)
のSystem.out.println();
のSystem.out.println( "幅優先トラバーサル:");
tree.bfs(ルート)
のSystem.out.println();
のSystem.out.println(「深さ優先トラバーサル:「);
リスト<リスト<文字列>>新しい新しいRST =のArrayList <>();
リスト<文字列> =新しい新しいリストのArrayList <>();
tree.dfs(根、RST、リスト);
System.out.printlnは( RST);
}
 

7.ログ:
再帰プレオーダー:
ABEIJFDGH
非再帰プレオーダー:
ABEIJFDGH
再帰トラバーサル順序:
IEJBFAGDH
非再帰プレオーダー:
IEJBFAGDH
再帰トラバーサル順序:
IJEFBGHDA
非再帰プレオーダー:
IJEFBGHDA
最初のトラバーサル:
ABDEFGHIJの
深さ優先横断
: [A、B、E、I]、[A、B、E、J]、[A、B、F.]、[A、D、G]、[A、D、H]
又は

再帰行きがけ:
124895367
非再帰行きがけ:
124895367
再帰的トラバーサル順序:
849251637
非再帰前順:
8 49251637
リア再帰行きがけ:
894526731
非再帰行きがけの後:
894526731
最初のトラバーサル:
123456789
深さ優先トラバーサル
: [[1、2、4、8]、[1、2、4、9]、[1、2、5]、[1,3]、[6]、[1、3、7]
意志int型のキャッシュデータの再文字列 
 

利点
バイナリツリーは、バイナリデータが大きいときには、標準的な配列に関して、従来の良好なパフォーマンスは、情報を取得するように変更することができるか、彼は、クエリのすべてを必要としない、という点で有利である全体の動作が減少し、それによって大幅に強化するデータを取得することができるように、あります効率が、データのほとんど意味は、私たちがDianshaに伝統的な検索操作を行いたい場合は、あなたが消費のうち、考えることができ、そのようなデータ2000万32ビットの文字列として、開くことは非常に簡単ではありません。

 

 

OK

 

 

 

継続的に更新

 

 


著者:ゆう神サント
出典:CSDN
オリジナル:https://blog.csdn.net/weixin_42749765/article/details/94737141
著作権:この記事はブロガーのオリジナルの記事、再現され、ボーエンのリンクを添付してください!

おすすめ

転載: blog.51cto.com/11719289/2421263