樹的深度優先遍歷和廣度優先遍歷的原理和java實現程式碼
阿新 • • 發佈:2019-01-09
樹的深度優先遍歷需要用到額外的資料結構--->棧;而廣度優先遍歷需要佇列來輔助;這裡以二叉樹為例來實現
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