java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)
package com.yc.test;
import java.util.ArrayList;
import java.util.List;
import com.yc.tree.ThreeLinkBinTree;
import com.yc.tree.ThreeLinkBinTree.Node;
/**
*
* @author wb
*
*遍歷二叉樹指的是按某種規律依次訪問二叉樹的每個節點,對二叉樹的遍歷過程就是將非線性結構的二叉樹中的節點排列成線性序列的過程。
*如果采用順序結構來保存二叉樹,程序遍歷二叉樹將非常容易,無需進行任何思考,直接遍歷底層數組即可。如果采用鏈表來保存二叉樹的節點,則有以下兩種遍歷方式:
*深度優先遍歷:這種遍歷算法將先訪問到樹中最深層次的節點。
*廣度優先遍歷:這種遍歷算法將逐層訪問每層的節點,先訪問根節點,然后訪問第二層的節點……以此類推。因此廣度優先遍歷又被稱為按層遍歷。
*
*對于深度優先遍歷算法而言,他可分為以下三種:
*(1)先序遍歷二叉樹
*(2)中序遍歷二叉樹
*(3)后序遍歷二叉樹
*
*如果L、D、R表示左子樹、根、右子樹,習慣上總是先遍歷左子樹,后遍歷右子樹,根據遍歷根節點的順序不同,上面三種方法可以表示如下:
*DLR:先序遍歷
*LDR:中序遍歷
*LRD:后序遍歷
*
******************************************************************
**深度遍歷的先序遍歷、中序遍歷、后序遍歷這三種遍歷方式的名稱都是針對根節點(D)而言的。*
**先處理根節點(D)時就稱為先序遍歷,其次處理根節點(D)是就稱為中序遍歷;最后處理根節點(D)*
**時就稱為后序遍歷。*
******************************************************************
*
*因為二叉樹的定義本身就具有“遞歸性”,所以深度優先遍歷時能非常方便地利用遞歸來遍歷每個節點:一棵非空二叉樹由樹根、
*左子樹和右子樹組成,依次遍歷這三部分,就可以遍歷整個二叉樹。
*
*下面以三叉鏈表結構的二叉樹為例實現這三種遍歷:
*/
public class DFS {
@SuppressWarnings({ "rawtypes", "unused", "unchecked" })
public static void main(String[] args) {
ThreeLinkBinTree tree = new ThreeLinkBinTree("A");
Node n2_l = tree.addAndReturn(tree.root(), "+", true);
Node n2_r = tree.addAndReturn(tree.root(), "B", false);
Node n3_n2_l = tree.addAndReturn(n2_l, "*", true);
Node n3_n2_r = tree.addAndReturn(n2_l, "D", false);
Node n4_n3_n2_l = tree.addAndReturn(n3_n2_l, "/", true);
Node n4_n3_n2_r = tree.addAndReturn(n3_n2_l, "%", false);
Node n5_n4_n3_n2_l = tree.addAndReturn(n4_n3_n2_r, "E", true);
Node n5_n4_n3_n2_r = tree.addAndReturn(n4_n3_n2_r, "F", false);
/**
* 此時二叉樹的情況為:
* A
* │ │
* + ←┘ └→ B
* │ │
* * ←┘ └→ D
* │ │
* / ←┘ └→ %
* │ │
* E ←┘ └→ F
*
*/
//先序遍歷結果
System.out.println( "先序遍歷結果:" + cDLR(tree) );
//中序遍歷結果
System.out.println( "中序遍歷結果:" + cLDR(tree) );
//后序遍歷結果
System.out.println( "后序遍歷結果:" + cLRD(tree) );
}
//先序遍歷
public static List cDLR(ThreeLinkBinTree tree){
return dLR(tree.root());
}
private static List dLR(Node node){
List nodes = new ArrayList();
nodes.add(node);
if(node.getLeft() != null){
nodes.addAll(dLR(node.getLeft()));
}
if(node.getRight() != null){
nodes.addAll(dLR(node.getRight()));
}
return nodes;
}
//中序遍歷
public static List cLDR(ThreeLinkBinTree tree){
return lDR(tree.root());
}
private static List lDR(Node node){
List nodes = new ArrayList();
if(node.getLeft() != null){
nodes.addAll(dLR(node.getLeft()));
}
nodes.add(node);
if(node.getRight() != null){
nodes.addAll(dLR(node.getRight()));
}
return nodes;
}
//后序遍歷
public static List cLRD(ThreeLinkBinTree tree){
return lRD(tree.root());
}
private static List lRD(Node node){
List nodes = new ArrayList();
if(node.getLeft() != null){
nodes.addAll(dLR(node.getLeft()));
}
if(node.getRight() != null){
nodes.addAll(dLR(node.getRight()));
}
nodes.add(node);
return nodes;
}
}
測試結果為:
先序遍歷結果:[A, +, *, /, %, E, F, D, B]
中序遍歷結果:[+, *, /, %, E, F, D, A, B]
后序遍歷結果:[+, *, /, %, E, F, D, B, A]
總結
以上是生活随笔為你收集整理的java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么解除路由器的绑定移动路由器端口绑定如
- 下一篇: 使用java理解程序逻辑试卷_《使用Ja