最近复习到了这个点,写点东西加强一下记忆吧
二叉树遍历
百度百科上是这么解释的:
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
很明显,遍历也会有着不同的方式,这里我们就简单的讲讲BFS和DFS
BFS(Breadth First Search)广度优先遍历
这种遍历方式可以理解为二叉树的层序遍历,即每层遍历完再去找下一层的内容,这里用图来表示更加直观:
那么我们就来开始思考,这种层序遍历该怎么用代码的方式表现出来,我们可以通过Queu的方式把这每一层的内容先暂时存储起来,根据队列的先进先出的效果,再后续取出来,那么难点就在于如何定位到每个结点上来判断他的左右孩子结点,答案便是我们可以直接在Queue中存储的就是他的TreeNode的形式,这样我们在将他放入的时候,可以直接定位到这个结点以便进行后续的添加操作。
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list =new ArrayList<>();
if(root==null){
return list;
}
Queue<TreeNode> queue =new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode treeNode =queue.poll();
list.add(treeNode.val);
if(treeNode.left!=null){
queue.offer(treeNode.left);
}
if(treeNode.right!=null){
queue.offer(treeNode.right);
}
}
return list;
}
}
DFS(Depth First Search)深度优先遍历
先从根节点出发,沿着左子树进行纵向遍历直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。
一开始看到DFS我是真的挺懵逼的,没什么入手的点,后来想到了BFS可以使用Queue的方式,那么 DFS有没有对应的数据结构呢,有的!栈!
public static List<Integer> DFSByStack(TreeNode root) {
if (root == null) {
return null;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
List<Integer> result = new ArrayList<>();
while (!stack.isEmpty()) {
TreeNode treeNode = stack.pop();
/*
处理 TreeNode 节点 的逻辑
*/
result.add(treeNode.val);
if (treeNode.right != null) {
stack.push(treeNode.right);
}
if (treeNode.left != null) {
stack.push(treeNode.left);
}
}
return result;
}
既然使用了栈,那么我们还可以使用系统自带的一种栈(递归),但是要注意全局变量的问题
public static List<Integer> DFSByRecursion(TreeNode root) {
if (root == null) {
return null;
}
/*
处理节点的逻辑(由于是递归的调用,定义ArrayList的时候不能写在方法内部)
private static List<Integer> result = new ArrayList<>();
此处的 result 的定义为了一个全局变量
*/
result.add(root.val);
if (root.left != null) {
DFSByRecursion(root.left);
}
if (root.right != null) {
DFSByRecursion(root.right);
}
return result;
}