一、核心思想
1、深度优先搜索
用栈做辅助,做回溯判断(搜索到哪一点就push,回溯就pop),直至初始点也回溯完。
2.广度优先搜索
利用队列的先进先出特点,每一轮都将当前节点的儿子们放进队列,一轮遍历结束时,当前层的儿子们已经放入队列,重复下去。
二、代码
/**
* 树节点结构
*/
class TreeNode {
int data;
TreeNode leftNode;
TreeNode rightNode;
public TreeNode() {
}
public TreeNode(int data) {
this.data = data;
}
public TreeNode(TreeNode leftNode,TreeNode rightNode,int data) {
this.leftNode = leftNode;
this.rightNode= rightNode;
this.data = data;
}
}
public class Main {
//广度优先遍历
public void BroadFirstSearch(TreeNode nodeHead) {
if(nodeHead == null) return;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(nodeHead);
while(!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.data + " ");
if(null != node.leftNode) {
queue.add(node.leftNode);
}
if(null != node.rightNode) {
queue.add(node.rightNode);
}
}
}
//深度优先遍历
public void depthFirstSearch(TreeNode nodeHead) {
if(nodeHead == null) return;
Stack<TreeNode> queue = new Stack<>();
queue.add(nodeHead);
while(!queue.isEmpty()) {
TreeNode node=queue.pop();
System.out.print(node.data + " ");
if(node.rightNode != null) {
queue.push(node.rightNode);
}
if(node.leftNode != null) {
queue.push(node.leftNode);
}
}
}
}