二叉树-二叉树的基础遍历(3)

news/2024/11/30 0:36:01/

二叉树的遍历的三种方式

1.前序遍历;
先访问根结点,然后再访问左子树,最后访问右子树
2.中序遍历;
先访问左子树,中间访问根节点,最后访问右子树
3.后序遍历;
先访问左子树,再访问右子树,最后访问根节点
如果我们分别对下面的树使用三种遍历方式进行遍历,得到的结果如下:
在这里插入图片描述

前序遍历

前序遍历的API:
public Queue preErgodic():使用前序遍历,获取整个树中的所有键
private void preErgodic(Node x,Queue keys):使用前序遍历,把指定树x中的所有键放入到keys队列中
实现步骤:
1.把当前结点的key放入到队列中;
2.找到当前结点的左子树,如果不为空,递归遍历左子树
3.找到当前结点的右子树,如果不为空,递归遍历右子树

代码实现:

//使用前序遍历,获取整个树中的所有键
public Queue<Key> preErgodic(){Queue<Key> keys = new Queue<>();preErgodic(root,keys);return keys;
}
//使用前序遍历,把指定树x中的所有键放入到keys队列中
private void preErgodic(Node x,Queue<Key> keys){if (x==null){return;
}//1.把当前结点的key放入到队列中;keys.enqueue(x.key);//2.找到当前结点的左子树,如果不为空,递归遍历左子树if (x.left!=null){preErgodic(x.left,keys);}//3.找到当前结点的右子树,如果不为空,递归遍历右子树if (x.right!=null){preErgodic(x.right,keys);}
}//测试代码public class Test {public static void main(String[] args) throws Exception {BinaryTree<String, String> bt = new BinaryTree<>();bt.put("E", "5");bt.put("B", "2");bt.put("G", "7");bt.put("A", "1");bt.put("D", "4");bt.put("F", "6");bt.put("H", "8");bt.put("C", "3");Queue<String> queue = bt.preErgodic();for (String key : queue) {System.out.println(key+"="+bt.get(key));}}
}

运行结果:

5=E
2=B
1=A
4=D
3=C
7=G
6=F
8=H

中序遍历

前序遍历的API:
public Queue midErgodic():使用中序遍历,获取整个树中的所有键
private void midErgodic(Node x,Queue keys):使用中序遍历,把指定树x中的所有键放入到keys队列中
实现步骤:
1.找到当前结点的左子树,如果不为空,递归遍历左子树
2.把当前结点的key放入到队列中;
3.找到当前结点的右子树,如果不为空,递归遍历右子树

代码实现:

//使用中序遍历,获取整个树中的所有键public Queue<Key> midErgodic(){Queue<Key> keys = new Queue<>();midErgodic(root,keys);return keys;}//使用中序遍历,把指定树x中的所有键放入到keys队列中private void midErgodic(Node x,Queue<Key> keys){if (x==null){return;}//1.找到当前结点的左子树,如果不为空,递归遍历左子树if (x.left!=null){midErgodic(x.left,keys);}//2.把当前结点的key放入到队列中;keys.enqueue(x.key);//3.找到当前结点的右子树,如果不为空,递归遍历右子树if (x.right!=null){midErgodic(x.right,keys);}
}
//测试代码
public class Test {public static void main(String[] args) throws Exception {BinaryTree<String, String> bt = new BinaryTree<>();bt.put("E", "5");bt.put("B", "2");bt.put("G", "7");bt.put("A", "1");bt.put("D", "4");bt.put("F", "6");bt.put("H", "8");bt.put("C", "3");Queue<String> queue = bt.midErgodic();for (String key : queue) {System.out.println(key+"="+bt.get(key));}}
}

运行结果:

1=A
2=B
3=C
4=D
5=E
6=F
7=G
8=H

后序遍历

后序遍历的API:
public Queue afterErgodic():使用后序遍历,获取整个树中的所有键
private void afterErgodic(Node x,Queue keys):使用后序遍历,把指定树x中的所有键放入到keys队列中
实现步骤:
1.找到当前结点的左子树,如果不为空,递归遍历左子树
2.找到当前结点的右子树,如果不为空,递归遍历右子树
3.把当前结点的key放入到队列中;

代码实现:

//使用后序遍历,获取整个树中的所有键
public Queue<Key> afterErgodic(){Queue<Key> keys = new Queue<>();afterErgodic(root,keys);return keys;
}
//使用后序遍历,把指定树x中的所有键放入到keys队列中
private void afterErgodic(Node x,Queue<Key> keys){if (x==null){return;
}
//1.找到当前结点的左子树,如果不为空,递归遍历左子树
if (x.left!=null){afterErgodic(x.left,keys);
}
//2.找到当前结点的右子树,如果不为空,递归遍历右子树
if (x.right!=null){afterErgodic(x.right,keys);
}
//3.把当前结点的key放入到队列中;
keys.enqueue(x.key);
}
//测试代码
public class Test {
public static void main(String[] args) throws Exception {BinaryTree<String, String> bt = new BinaryTree<>();bt.put("E", "5");bt.put("B", "2");bt.put("G", "7");bt.put("A", "1");bt.put("D", "4");bt.put("F", "6");bt.put("H", "8");bt.put("C", "3");Queue<String> queue = bt.afterErgodic();for (String key : queue) {System.out.println(key+"="+bt.get(key));}
}
}

运行结果:

1=A
3=C
4=D
2=B
6=F
8=H
7=G
5=E

二叉树的层序遍历

所谓的层序遍历,就是从根节点(第一层)开始,依次向下,获取每一层所有结点的值,有二叉树如下:
那么层序遍历的结果是:EBGADFHC
层序遍历的API:
public Queue layerErgodic():使用层序遍历,获取整个树中的所有键
实现步骤:
1.创建队列,存储每一层的结点;
2.使用循环从队列中弹出一个结点:
2.1获取当前结点的key;
2.2如果当前结点的左子结点不为空,则把左子结点放入到队列中
2.3如果当前结点的右子结点不为空,则把右子结点放入到队列中
在这里插入图片描述
代码:

//使用层序遍历得到树中所有的键
public Queue<Key> layerErgodic(){Queue<Key> keys = new Queue<>();Queue<Node> nodes = new Queue<>();nodes.enqueue(root);while(!nodes.isEmpty()){Node x = nodes.dequeue();keys.enqueue(x.key);if (x.left!=null){nodes.enqueue(x.left);}if (x.right!=null){nodes.enqueue(x.right);}}
}
//测试代码
public class Test {
public static void main(String[] args) throws Exception {BinaryTree<String, String> bt = new BinaryTree<>();bt.put("E", "5");bt.put("B", "2");bt.put("G", "7");bt.put("A", "1");bt.put("D", "4");bt.put("F", "6");bt.put("H", "8");bt.put("C", "3");Queue<String> queue = bt.layerErgodic();for (String key : queue) {System.out.println(key+"="+bt.get(key));}
}
}

结果:

5=E
2=B
7=G
1=A
4=D
6=F
8=H
3=C

参考:黑马程序员Java数据结构与java算法全套教程


http://www.ppmy.cn/news/3284.html

相关文章

JS文件操作介绍

JS文件操作介绍 本文将介绍前端浏览器支持的JS文件操作技术。相关权威技术资料 带有 type"file" 的 <input> 元素允许用户可以从他们的设备中选择一个或多个文件。<input type"file"> - HTML&#xff08;超文本标记语言&#xff09; | MDN …

JavaEE-多线程初阶2

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Thread类及常见方法获取当前线程引用休眠当前线程线程的状态线程的所有状态线程状态多线程的意义多线程带来的的风险-线程安全…

【有营养的算法笔记】巧解蛇形矩阵

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;有营养的算法笔记 ✉️分类专栏&#xff1a;题解 文章目录一、题目描述二、思路讲解三、代码实现一、题目描…

基于Android的二维码识别系统的研究 与实现

XXXX 本科生毕业设计(论文) 学院(系)&#xff1a; XX 专 业&#xff1a; XX 学 生&#xff1a; XX 指导教师&#xff1a; XX XX 完成日期 年 月 XXX本科生毕业设计&#xff08;论文&#xff09; 基于Android的二维码识别系统的研究 与实现 Research and Implementati…

Linux 的常用命令

前言 本篇博客给大家介绍一些常见的 Linux 命令 目录操作 pwd 查看当前工作目录 clear 清除屏幕 cd ~ 当前用户目录 cd / 根目录 cd - 上一次访问的目录 cd .. 上一级目录 其中清除屏幕的快捷键是: ctrl l ls 语法: ls 选项 目录或文件 功能: 对于目录来说…

如何解决 Redis 数据倾斜、热点等问题

大家好&#xff0c;我是Tom哥。 Redis 作为一门主流技术&#xff0c;应用场景非常多&#xff0c;很多大中小厂面试都列为重点考察内容 前几天有星球小伙伴学习时&#xff0c;遇到下面几个问题&#xff0c;来咨询 Tom哥 考虑到这些问题比较高频&#xff0c;工作中经常会遇到&…

树莓派通过RF443MHz收发控制家庭灯

背景&#xff1a;家中随意贴开关损坏(一种通过443MHz控制的远程开关)&#xff0c;且关灯后到卧室需要摸黑&#xff0c;萌生了搞远程控制灯的想法&#xff0c;因为有吃灰的树莓派&#xff0c;所以考虑了最低成本的方案&#xff0c;只需购买价值几元钱的443MHz收发模块即可。 一…

社群私域流量的用户消费路径是什么

针对于用户运营&#xff0c;现在的企业是比较纠结的&#xff0c;企业主要纠结的对象就是应该采用什么方式来进行用户运营&#xff0c;只有将用户运营做好&#xff0c;那么企业才能够达成自己的目的&#xff0c;一般针对于用户运营&#xff0c;基于当前的市场环境&#xff0c;企…