二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)
深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完成所有可达节点为止。
广度优先遍历:从根节点出发,在横向遍历二叉树层段节点的技术上纵向遍历二叉树的层次。
DFS:ABDECFG
BFS:ABCDEFG
DFS实现:
数据结构:栈
遍历操作:父节点入栈,父节点出栈,先右子节点入栈,后左子节点入栈,递归遍历全部节点。
BFS实现:
数据结构:队列
遍历操作:父节点入队列,父节点出队列,先左子节点入队列,后右子节点处队列,递归遍历全部节点。
public class Node {
char data;
Node leftChild;
Node rightChild;
}
//深度优先遍历
public void depthFirstSearch(Node rNode){
Stack stack = new Stack();
stack.push(rNode);
Node node = null;
while(!stack.empty()){
node = stack.pop();
System.out.print(node.data);//遍历根结点
if(node.rightChild != null){
stack.push(node.rightChild);//先将右子树压栈
}
if(node.leftChild != null){
stack.push(node.leftChild);//再将左子树压栈
}
}
}
//广度优先遍历
public void breadFirstSearch(Node rNode){
LinkedList queue = new LinkedList<Node>();
queue.offer(rNode);
Node node = null;
while(!queue.empty()){
node = queue.poll();
System.out.print(node.data);//遍历根结点
if(node.leftChild() != null){
queue.offer(node.leftChild);//先将左子树入队
}
if(node.rightChild() != null){
queue.offer(node.rightChild);//再将右子树入队
}
}
}