dfs实现

1.思路:从图中的未访问的一个顶点开始,沿着一条路一直走到底,然后
这条路尽头的节点,在从另外一条路走到底,不断递归此过程,直到所有
遍历完成
特点:不撞南墙不回头
2.具体实现:当从一个未知的顶点出发,将这条路走完时,会返回到上
一个节点,看他是否还有其他的子节点,如果有就继续往下遍历,如果没有就继续返回到
上一个节点,继续寻找除本身外还有其他节点不,以此类推
前序遍历:中左右
中序遍历:左中右
后序遍历:左右中
3.递归实现dfs
public class solution{
private static class Node{
public int value;//定义节点
public Node left;//定义左节点
public Node right;//定义右节点
//有参构造用来干什么的呢?
public Node(int value,Node left,Node right){
this.value = value;
this.left = left;
this.right = right;}
}
//dfs方法用来实现递归遍历所有节点
public static void dfs(Node treeNode){
if(treeNode ==null){return;}
process(treeNode);//为什么通过process方法遍历节点
dfs(treeNode.left);//为什么通过dfs来遍历左右节点?
dfs(treeNode.right);}
}
学了一遍基础,但是不扎实,很多东西不明白他的具体含义就过了
但这就是个过程,明白自己的不足,继续深深地学习
递归总结:递归中,节点类中定义了节点,左节点以及右节点,还有
有参构造,但忘记了有参构造的作用?
有参构造的作用用于属性初始化
如果子类继承父类时,子类中没有无参构造会报错
在在定义的静态dfs方法中,调用了process和dfs方法利用递归的思想
实现了dfs算法
4.非递归实现dfs算法
public void solution{
public static void dfswithstack(Node root){
if(root ==null){retuen;}
Stack<Node>stack = new Stack<>();
stack.push(root)//将根节点压入栈中;
while(!stack.isEmpty()){
Node treeNode = stack.pop();
process(treeNode);//遍历节点
if(treeNode.right!=null){stack.push(treeNode.right);}
if(treeNode.left!=null){stack.push(treeNode.left);}
}
}
}
总结:非递归方法实现dfs利用栈的先进后出的特点实现
①先创建一个有参函数来实现dfs算法的实现
②判断根节点是否为空,如果为空结束
③定义一个节点类型的栈对象,先将根节点压入栈中
④判断栈中的元素是否为空,如果不为空,
定义一个节点对象来表示栈的出栈
⑤之后通过process方法来遍历出栈元素
⑥在依次通过栈先进后出的思想通过先序遍历先将右节点进栈,
再将左节点进栈。后面再通过上面的treeNode对象将元素出栈,
并通过process方法遍历
注意:进栈的顺序以及各个节点进栈出栈的代码顺序
5..生产中泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫

posted @ 2021-06-18 22:09  求知律己  阅读(254)  评论(0编辑  收藏  举报