肌のデータアウト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
著作権:この記事はブロガーのオリジナルの記事、再現され、ボーエンのリンクを添付してください!