1. 程式人生 > >樹的深度優先遍歷和廣度優先遍歷的原理和java實現程式碼

樹的深度優先遍歷和廣度優先遍歷的原理和java實現程式碼

樹的深度優先遍歷需要用到額外的資料結構--->棧;而廣度優先遍歷需要佇列來輔助;這裡以二叉樹為例來實現

import java.util.ArrayDeque;publicclassBinaryTree{staticclassTreeNode{int value;TreeNode left;TreeNode right;publicTreeNode(int value){this.value=value;}}TreeNode root;publicBinaryTree(int[] array){
        root=makeBinaryTreeByArray(array,1);
}/** * 採用遞迴的方式建立一顆二叉樹 * 傳入的是二叉樹的陣列表示法 * 構造後是二叉樹的二叉連結串列表示法 */publicstaticTreeNode makeBinaryTreeByArray(int[] array,int index){if(index<array.length){int value=array[index];if(value!=0){TreeNode t=newTreeNode(value); array[index]=0; t.left=makeBinaryTreeByArray
(array,index*2); t.right=makeBinaryTreeByArray(array,index*2+1);return t;}}returnnull;}/** * 深度優先遍歷,相當於先根遍歷 * 採用非遞迴實現 * 需要輔助資料結構:棧 */publicvoid depthOrderTraversal(){if(root==null){System.out.println("empty tree");return;}ArrayDeque<TreeNode> stack=newArrayDeque
<TreeNode>(); stack.push(root);while(stack.isEmpty()==false){TreeNode node=stack.pop();System.out.print(node.value+" ");if(node.right!=null){ stack.push(node.right);}if(node.left!=null){ stack.push(node.left);}}System.out.print("\n");}/** * 廣度優先遍歷 * 採用非遞迴實現 * 需要輔助資料結構:佇列 */publicvoid levelOrderTraversal(){if(root==null){System.out.println("empty tree");return;}ArrayDeque<TreeNode> queue=newArrayDeque<TreeNode>(); queue.add(root);while(queue.isEmpty()==false){TreeNode node=queue.remove();System.out.print(node.value+" ");if(node.left!=null){ queue.add(node.left);}if(node.right!=null){ queue.add(node.right);}}System.out.print("\n");}/** * 13 * / \ * 65 5 * / \ \ * 97 25 37 * / /\ / * 22 4 28 32 */publicstaticvoid main(String[] args){int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0};BinaryTree tree=newBinaryTree(arr); tree.depthOrderTraversal(); tree.levelOrderTraversal();}}

http://outofmemory.cn/code-snippet/4189/biinary-tree-java