java实现二叉树的Node节点定义,并手撕8种遍历

更新时间:2023-07-11 09:33:30 阅读: 评论:0

java实现⼆叉树的Node节点定义,并⼿撕8种遍历
最近准备秋招⾯试,发现⼆叉树这种可以⽆限扩展知识点来虐别⼈的数据结构,很受⾯试官的青睐。
如果掌握的不好,会直接死在⼀⾯哦。
怕吗?当你原理、思想,内部结构通通明⽩,分分钟⼿撕代码的程度,还怕吗?
本篇⽂章就从⽤java的思想和程序从最基本的怎么将⼀个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,⾮递归前序遍历,⾮递归前序遍历,⾮递归前序遍历,到最后的⼴度优先遍历和深度优先遍历
来咯!
⼀、Node节点的java实现
⾸先在可以看到打上Node这个字符串,就可以看到只能的IDEA系统提供的好多提⽰:
点进去看,却不是可以直接构成⼆叉树的Node,不是我们需要的东西。这⾥举个例⼦来看
org.w3c.dom
这⾥⾯的Node是⼀个接⼝,是解析XML时的⽂档树。在官⽅⽂档⾥⾯看出:该 Node 接⼝是整个⽂档
对象模型的主要数据类型。它表⽰该⽂档树中的单个节点。当实现 Node 接⼝的所有对象公开处理⼦节点的⽅法时,不是实现 Node 接⼝的所有对象都有⼦节点。
所以我们需要⾃定义⼀个Node类
package ;
public class Node {
private int value;        //节点的值crooked是什么意思
private Node node;        //此节点,数据类型为Node
private Node left;        //此节点的左⼦节点,数据类型为Node
private Node right;      //此节点的右⼦节点,数据类型为Node
public int getValue() {
return value;
}
public void tValue(int value) {
this.value = value;
}
public Node getNode() {
return node;
}
public void tNode(Node node) {
}
slide overpublic Node getLeft() {
return left;
}
public void tLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
高中英语语法练习题}
功夫熊猫主题曲public void tRight(Node right) {
this.right = right;
}
public Node(int value) {
this.value=value;
this.left=null;
this.right=null;
}
public String toString() {        //⾃定义的toString⽅法,为了⽅便之后的输出
return this.value+" ";
}
}
定义好了之后就可以开始直接使⽤了,相信⼤家都可以秒看懂。
⼆、数组升华⼆叉树
⼀般拿到的数据是⼀个int型的数组,那怎么将这个数组变成我们可以直接操作的树结构呢?
1、数组元素变Node类型节点
2、给N/2-1个节点设置⼦节点
3、给最后⼀个节点设置⼦节点【有可能只有左节点】
那现在就直接上代码
public  static void create(int[] datas,List<Node> list) {
//将数组⾥⾯的东西变成节点的形式
for(int i=0;i<datas.length;i++) {
Node node=new Node(datas[i]);
list.add(node);xcopy
}
//节点关联成树
for(int index=0;index<list.size()/2-1;index++) {
<(index).(index*2+1));
//编号为n的节点他的左⼦节点编号为2*n 右⼦节点编号为2*n+1 但是因为list从0开始编号,所以还要+1  (index).(index*2+2));  //与上同理
}
//单独处理最后⼀个⽗节点 ,list.size()/2-1进⾏设置,避免单孩⼦情况
int index=list.size()/2-1;
<(index).(index*2+1));
if(list.size()%2==1)
//如果有奇数个节点,最后⼀个⽗节点才有右⼦节点
<(index).(index*2+2));
}
很细致的加上了很多的注释啊,所以保证⼀看就懂。
开始⼤招前的攒⾦币过程正式结束
现在开始放⼤招
三、递归前序遍历
具体的原理没有什么好讲的,知道顺序即可
先序遍历过程:
(1)访问根节点;
笔译考试(2)采⽤先序递归遍历左⼦树;
(3)采⽤先序递归遍历右⼦树;
这⾥⽤图来说明
先序遍历结果:A BDFE CGHI
还是看代码吧
public void preTraversal(Node node){
if (node == null) //很重要,必须加上当遇到叶⼦节点⽤来停⽌向下遍历            return;
System.out.Value()+" ");
Left());
写昆虫的作文Right());
}
新概念英语第三册下载看,说了很简单吧!
四、递归中序遍历
中序遍历:
(1)采⽤中序遍历左⼦树;
(2)访问根节点;
(3)采⽤中序遍历右⼦树
中序遍历结果:DBEF A GHCI
有请代码:
public void    MidTraversal(Node node){
if (node == null)
return;
Left());
System.out.Value()+" ");
Right());
}
五、递归后序遍历
后序遍历:
(1)采⽤后序递归遍历左⼦树;
ccpo
(2)采⽤后序递归遍历右⼦树;
(3)访问根节点;
后序遍历的结果:DEFB HGIC A
代码:
public void postTraversal(Node node){
和音是什么意思
if (node == null)
return;
Left());
Right());
System.out.Value()+" ");
}
其实代码和思想⼀样,只是输出的位置和递归调⽤的位置不同⽽已。
个⼈觉得懂得⾮递归的原理和代码⽐懂递归更有意思,当你能⼿撕⾮递归⼆叉树遍历的时候,⾯试官问你原理,还能不知道吗?
那接下来的三个模块就是⾮递归的三种遍历
拭⽬以待
六、⾮递归前序遍历
我这⾥使⽤了栈这个数据结构,⽤来保存不到遍历过但是没有遍历完全的⽗节点
之后再进⾏回滚。
基本的原理就是当循环中的p不为空时,就读取p的值,并不断更新p为其左⼦节点,即不断读取左⼦节点,直到⼀个枝节到达最后的⼦节点,再继续返回上⼀层进⾏取值
代码:

本文发布于:2023-07-11 09:33:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/173993.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:节点   遍历   递归
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图