二叉樹路徑的查找(和爲某一值)

二叉樹路徑的尋找,即爲二叉樹的遍歷.

二叉樹遍歷過程的實現步驟:

(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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章