深度优先遍历
基于递归方式的遍历
基于递归的方式首先考虑处理到叶子节点时要怎么处理,这里采用最简单的方式进行处理直接返回
之后按照不同遍历方式的特性区安排具体的节点处理逻辑
# 前序遍历
public static void dfs(Node node){
if(node == null){
return;
}
System.out.print(node.value);
dfs(node.left)
dfs(node.right)
}
# 中序遍历
public static void dfs(Node node){
if(node == null){
return;
}
dfs(node.left);
System.out.print(node.value);
dfs(node.right);
}
# 后续遍历
public static void dfs(Node node){
if(node == null){
return;
}
dfs(node.left);
dfs(node.right);
System.out.print(node.value);
}
基于栈的遍历
递归遍历二叉树有一个潜在的问题,如果二叉树的深度为一个极大值的时候会导致栈溢出问题,使用栈保存节点可以避免这个问题
# 前序遍历
public static void dfs(Node node){
Stack<Node> stack = new Stack();
Node cur = node;
while(cur != null || !stack.isEmpty()){
while(cur != null){
System.out.print(cur.value);
cur = cur.left
stack.push()
}
cur = stack.pop();
cur = cur.right;
}
}
# 中序遍历
public static void dfs(Node node){
Stack<Node> stack = new Stack();
Node cur = node;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
System.out.print(cur.value);
cur = cur.right;
}
}
# 后续遍历
public static void dfs(Node node){
Stack<Node> stack = new Stack();
Node cur = node;
Node pre = null;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.peek();
if(cur.right != null && cur.right != pre){
cur = cur.right;
}else{
System.out.print(node.value);
stack.pop();
cur = null;
}
}
}