当前位置: 首页 > news >正文

58网站一起做网店/高端定制网站建设

58网站一起做网店,高端定制网站建设,智慧园区管理系统,WordPress实现网址导航本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现。这也是解决树的遍历问题的固定套路。一、二叉树的先序、中序、后序遍历1、递归模板(1)先序1 public voidpreorder(TreeNod…

本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现。这也是解决树的遍历问题的固定套路。

一、二叉树的先序、中序、后序遍历

1、递归模板

(1)先序

1 public voidpreorder(TreeNode root) {2 if (root == null) {3 return;4 }5 res.add(root.val);6 preorder(root.left);7 preorder(root.right);8 }

(2)中序

1 public voidinorder(TreeNode root) {2 if (root == null) {3 return;4 }5 inorder(root.left);6 res.add(root.val);7 inorder(root.right);8 }

(3)后序

1 public voidpostorder(TreeNode root) {2 if (root == null) {3 return;4 }5 postorder(root.left);6 postorder(root.right);7 res.add(root.val);8 }

2、迭代模板:显式使用栈

(1)先序 。也可以使用后文的DFS实现

1 public voidpreorder(TreeNode root) {2 Deque stack = new ArrayDeque<>();3 null || !stack.isEmpty()) {4 null) {5 stack.push(root);6 res.add(root.val);//保存结果

7 root =root.left;8 }9 root =stack.pop();10 root =root.right;11 }12 }

(2)中序

1 public voidinorder(TreeNode root) {2 Deque stack = new ArrayDeque<>();3 null || !stack.isEmpty()) {4 null) {5 stack.push(root);6 root =root.left;7 }8 root =stack.pop();9 res.add(root.val);//保存结果

10 root =root.right;11 }12 }

(3)后序。先序是根——左——右,而后序是左-右-根,可以将先序改成根-右-左,然后将结果反转。如下代码对比先序的代码:

1 public voidpostorder(TreeNode root) {2 Deque stack = new ArrayDeque<>();3 null || !stack.isEmpty()) {4 null) {5 stack.push(root);6 res.add(root.val);//保存结果

7 root = root.right;//注意这里和先序、中序的差别

8 }9 root =stack.pop();10 root =root.left();11 }12 Collections.reverse(res);//将前面的结果反转

13 }

当然,上面这种方法比较间接,借助于先序遍历的理解。下面采用一种直接的迭代方式:

1 public voidpostorder(TreeNode root) {2 Deque stack = new ArrayDeque<>();3 TreeNode preNode = new TreeNode();//该节点用于保存前一个出栈的节点

4 while (root != null || !stack.isEmpty()) {5 //将当前节点的左子树节点一次入栈

6 while (root != null) {7 stack.push(root);8 root =root.left;9 }10 root =stack.peek();11 //当前节点没有右孩子了,或者其右孩子已经出栈了,则当前节点也出栈

12 if (root.right == null || root.right ==preNode) {13 root =stack.pop();14 res.add(root.val);//保存结果

15 preNode = root; //记录本次刚输出的节点

16 root = null;17 } else{18 //当前节点还有右孩子,且其右孩子还没有出栈,则先处理其右孩子

19 root =root.right;20 }21 }22 }

二、N叉树的先序与后序遍历

1、递归模板

(1)先序

1 public voidpreorder(TreeNode root) {2 if (root == null) {3 return;4 }5 res.add(root.val);//保存结果

6 if (root.children != null) {7 for (int i = 0; i < root.children.size(); i++) {8 dfs(root.children.get(i));9 }10 }11 }

(2)后序

1 public voidpostorder(TreeNode root) {2 if (root == null) {3 return;4 }5 for (int i = 0; i < root.children.size(); i++) {6 postorder(root.children.get(i));7 }8 res.add(root.val);//保存结果

9 }

2、迭代模板

(1)先序。即下文中DFS的实现

1 public voidpreorder(Node root) {2 Deque stack = new ArrayDeque<>(); //BFS使用队列,这里使用栈

3 stack.push(root);4 while (!stack.isEmpty()) {5 root =stack.pop();6 res.add(root.val);//保存结果

7 int childCount = root.children == null ? 0: root.children.size();8 //这里需要注意孩子节点入栈的顺序

9 for (int i = childCount - 1; i >= 0; i--) {10 stack.push(root.children.get(i));11 }12 }13 }

(2)后序。先序是根——左——右,而后序是左-右-根,可以将先序改成根-右-左,然后将结果反转。如下代码对比先序的代码:

1 public voidpostorder(Node root) {2 List result = new ArrayList<>();3 Deque stack = new ArrayDeque<>();4 stack.push(root);5 while (!stack.isEmpty()) {6 root =stack.pop();7 result.add(root.val);//保存结果

8 int childCount = root.children == null ? 0: root.children.size();9 //还入栈的顺序正好和先序遍历相反

10 for (int i = 0; i < childCount; i++) {11 stack.push(root.children.get(i));12 }13 }14 //将结果反转

15 Collections.reverse(result);16 for(Integer i:result) {17 System.out.print(i);18 }19 }

目前还没有找到类似二叉树直接后序遍历的方法

三、树的BFS(广度优先搜索)和DFS(深度优先搜索)实现模板

1、递归实现

(1)BFS

一般来说不能使用递归来实现BFS,因为BFS使用的时队列实现,而递归使用的是栈实现。

(2)DFS

普通的N叉树的DFS包括先序遍历和后序遍历,它们的递归实现和前文一致。如果是二叉树,还有中序遍历,递归实现和前文一致。

2、迭代实现

(1)BFS。即按层次来遍历

1 public voidbfs(Node root) {2 Queue queue = new LinkedList<>();3 queue.offer(root);4 while (!queue.isEmpty()) {5 root =queue.poll();6 res.add(root.val);//保存结果

7 if (root.children != null) {8 queue.addAll(root.children);9 }10 }11 }

(2)DFS

先序遍历、中序遍历(二叉树)和后序遍历的迭代方式实现和前文一致。

四、图的BFS和DFS遍历模板

树是图的一种特殊情况,相比于树而言图中可能出现环,所以在遍历的时候可能重复访问。所以树的BFS和DFS实现需要在树的基础上维护一个Set来避免访问重复的节点即可。

1、BFS

1 public voidgraphyBfs(Node root) {2 if (root == null) {3 return;4 }5 Set visitedSet = new HashSet<>(); //维护一个set,保存已经访问过的节点

6 Queue queue = new LinkedList<>();7 queue.offer(root);8 while (!queue.isEmpty()) {9 root =queue.poll();10 visitedSet.add(root);//保存每个已经输出的节点

11 res.add(root.val);//保存结果

12 if (root.children == null) {13 return;14 }15 for (int i = 0; i < root.children.size(); i++) {16 Node tmpNode =root.children.get(i);17 if (!visitedSet.contains(tmpNode)) {//已经输出过的节点,则不用再加入

18 queue.offer(tmpNode);19 }20 }21 }22 }

2、DFS

迭代方式、递归方式,都维护一个set来保存已经访问过的节点,在输出节点时保存到set中,在添加节点时添加去重操作即可。

http://www.jmfq.cn/news/5166973.html

相关文章:

  • 网页设计意图怎么写/百度seo软件曝光行者seo
  • 网站设计怎么算间距/什么是淘宝搜索关键词
  • 网站购买云空间/百度一下你就知道百度官网
  • 阿里云 建设网站怎么样/2024年将爆发新瘟疫
  • 如何替换网站ico图标/百度认证营销推广师
  • 怎么新增网站推广/重庆seo优化推广
  • 汕头市研发网站建设/最新app推广
  • 免费订单管理app/网站优化seo怎么做
  • 手机制作钓鱼网站/引擎搜索对人类记忆的影响
  • 精品网站建设费用 磐石网络/营销软件
  • 哪个公司做网站好/安卓aso优化工具
  • 商业网站推广/产品营销策划方案3000字
  • 中心网站建设/南昌seo排名收费
  • 自己做的一个网站怎么赚钱/网络广告网站
  • 织梦网站统计/十大网络推广公司排名
  • 外贸购物网站建设/西安市seo排名按天优化
  • 做外贸需要网站吗/bt蚂蚁
  • 如何做新增网站备案/武汉网站seo推广
  • 垂直门户网站有哪些/百度seo关键词优化电话
  • 网站建设优化排名/机器人编程培训机构排名
  • 网站建设公司上海做网站公司哪家好/不收费的小说网站排名
  • 手机网站淘宝客/免费下载app并安装
  • 网站建设 模板/在线seo诊断
  • 做pc端网站行情/北京seo报价
  • 哪个行业最容易做网站/今日重大财经新闻
  • 企业局域网的组建与网站建设论文/武汉搜索引擎排名优化
  • 华宇网站建设/海外seo网站推广
  • 手机网站系统下载/推广网站
  • 网站建设分析/夫唯seo怎么样
  • 外贸免费开发网站建设/创建自己的网站