转自:
树的深度优先遍历需要用到额外的数据结构--->栈;而广度优先遍历需要队列来辅助;这里以二叉树为例来实现。importjava.util.ArrayDeque;public classBinaryTree {static classTreeNode{intvalue;
TreeNode left;
TreeNode right;public TreeNode(intvalue){this.value=value;
}
}
TreeNode root;public BinaryTree(int[] array){
root=makeBinaryTreeByArray(array,1);
}/*** 采用递归的方式创建一颗二叉树
* 传入的是二叉树的数组表示法
* 构造后是二叉树的二叉链表表示法*/
public static TreeNode makeBinaryTreeByArray(int[] array,intindex){if(index
TreeNode t=newTreeNode(value);
array[index]=0;
t.left=makeBinaryTreeByArray(array,index*2);
t.right=makeBinaryTreeByArray(array,index*2+1);returnt;
}
}return null;
}/*** 深度优先遍历,相当于先根遍历
* 采用非递归实现
* 需要辅助数据结构:栈*/
public voiddepthOrderTraversal(){if(root==null){
System.out.println("empty tree");return;
}
ArrayDeque stack=new ArrayDeque();
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");
}/*** 广度优先遍历
* 采用非递归实现
* 需要辅助数据结构:队列*/
public voidlevelOrderTraversal(){if(root==null){
System.out.println("empty tree");return;
}
ArrayDeque queue=new ArrayDeque();
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*/
public static voidmain(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();
}
}