二叉樹路徑的尋找,即爲二叉樹的遍歷.
二叉樹遍歷過程的實現步驟:
(1)若二叉樹爲空,則遍歷結束
(2)若二叉樹不爲空,則開始遍歷二叉樹,遍歷二叉樹的順序有一下六種方式:
① DLR 先訪問根,再遍歷左子樹,然後遍歷右子樹(先序遍歷)
② DRL先訪問根,再遍歷右子樹,然後遍歷左子樹(先序遍歷)
③ LDR先遍歷左子樹,再訪問根,然後遍歷右子樹(中序遍歷)
④ LRD先遍歷左子樹,再遍歷右子樹,然後訪問根(後序遍歷)
⑤ RLD先遍歷右子樹,再遍歷左子樹,然後訪問根(後序遍歷)
⑥ RDL先遍歷右子樹,再訪問根,然後遍歷右子樹(中序遍歷)
根據不同的遍歷方法,可以編寫不同二叉樹的遍歷算法,一般採用的是先序遍歷(遞歸函數實現)。
java實現樹節點的定義:
class Node{
char title;//樹節點的標誌符
int value;//樹節點的數據域
Node left;//樹的左孩子
Node right;//樹的右孩子
public Node(char title , int value , Node left , Node right){
this.title = title;
this.value = value;
this.left = left;
this.right = right;
}
}
java實現尋找相應路徑(和爲某一值)的實現:
public class TreeFindPath {
public void FindPath(Node root,int x){
if( root == null){
return;
}
List<Node> list = new ArrayList<Node>();
int sum = 0;
FindPath(root, list, sum, x);
}
private void FindPath(Node root, List<Node> list, int sum, int x){
//根節點放入list
sum += root.value;
list.add(root);
//輸出list結果
if( sum == x && root.left == null && root.right == null){
for(int i = 0; i < list.size(); i++){
System.out.print( " "+list.get(i).title+":"+list.get(i).value+" ");
}
System.out.println();
}
//遍歷左子樹
if(root.left!=null){
FindPath(root.left, list, sum, x);
}
//遍歷右子樹
if(root.right!=null){
FindPath(root.right, list, sum, x);
}
sum -= root.value;
list.remove(root);
}
public static void main(String []args){
Node d = new Node('D', 4, null, null);
Node e = new Node('E', 5, null, null);
Node f = new Node('F', 6, null, null);
Node g = new Node('G', 7, null, null);
Node b = new Node('B', 2, d, e);
Node c = new Node('C', 3, f, g);
Node a = new Node('A', 1, b, c);
new TreeFindPath().FindPath(a, 10);//定義查找的和爲10的路徑
}
}
注:
針對本問題,本例採用的先序遍歷的方式存入List
針對不同的問題,採用不同的遍歷方式,以及相應的集合類。例如也可以使用HashSet,LinkList等集合類
本代碼的執行結果:
A:1
C:3
F:6