学习目标:
- 用二叉树实现添加和输出
提前预习内容:
- 内部类和外部类
- 类中定义类本身
- 递归算法
- 上一阶段的链表https://blog.csdn.net/aierken2/article/details/124020782?spm=1001.2014.3001.5501
代码块:
public class test7 {
public static void main(String[] args) {
erchashu cs = new erchashu();
cs.add(12);
cs.add(16);
cs.add(18);
cs.add(9);
cs.add(53);
cs.add(45);
cs.print();
}
}
class erchashu{
private Node root;
public void add(int data){
if (root == null){
root = new Node(data);
}else{
root.addNode(data);
}
}
public void print(){
if(root !=null)
root.printNode();
}
//内部类
class Node{
private int data;
private Node left; //左
private Node right; //右
//构造方法
public Node(int data){
this.data = data;
}
//内部类添加方法
private void addNode(int data){
if(this.data>data){ //如果新进来的数据小于当前数据
if(this.left == null){ //如果左链接为空
this.left = new Node(data); //做链接存储新数据
}else{ //如果左链接不为空
this.left.addNode(data); //继续调用左链接的addNode方法
}
}else{ //如果新进来的数大于或等于当前数据
if(this.right == null){ //如果右链接为空
this.right = new Node(data); //有链接存储新数据
}else{ //如果右链接不为空
this.right.addNode(data); //继续调用右链接的addNode方法
}
}
}
//中序遍历
private void printNode(){
if(this.left != null){ //如果左链接不为空
this.left.printNode(); //继续调用左链接的printNode 方法
}
System.out.print(this.data+"=>"); //左链接都调用完了之后输出当前数据
if(this.right != null){ //如果右链接不为空
this.right.printNode(); //继续调用右链接的printNode 方法
}
}
}
}
代码分析:
代码结构跟上一阶段的链表极为相似,唯一不同的就是二叉树右两个内部类类型的数据
添加数据时
先判断根节点是否为null
- 如果为null,添加第一个数据,直接给root赋值即可
- 如果不是null,调用根数据中的addNode()方法
public void add(int data){
if (root == null){
root = new Node(data);
}else{
root.addNode(data);
}
}
- 在addNode()方法中判断一下新添加的数据跟当前的数据大小
如果比当前数据小 | 如果比当前数据大 | ||
---|---|---|---|
左链接为null | 左链接为非null | 右链接为null | 右链接为非null |
添加数据 | 调用addNode()方法 | 添加数据 | 调用addNode()方法 |
//内部类添加方法
private void addNode(int data){
if(this.data>data){ //如果新进来的数据小于当前数据
if(this.left == null){ //如果左链接为空
this.left = new Node(data); //做链接存储新数据
}else{ //如果左链接不为空
this.left.addNode(data); //继续调用左链接的addNode方法
}
}else{ //如果新进来的数大于或等于当前数据
if(this.right == null){ //如果右链接为空
this.right = new Node(data); //有链接存储新数据
}else{ //如果右链接不为空
this.right.addNode(data); //继续调用右链接的addNode方法
}
}
}
输出数据
先判断根节点是否为null
- 如果是空,调用printNode()方法
public void print(){
if(root !=null)
root.printNode();
}
1,在printNode()方法,先判断左链接是否为空
- 如果是,继续调用printNode()方法
2,输出当前数据
3,判断右链接是否为空
- 如果是,继续调用printNode()方法
//中序遍历
private void printNode(){
if(this.left != null){ //如果左链接不为空
this.left.printNode(); //继续调用左链接的printNode 方法
}
System.out.print(this.data+"=>"); //左链接都调用完了之后输出当前数据
if(this.right != null){ //如果右链接不为空
this.right.printNode(); //继续调用右链接的printNode 方法
}
}
其实此方法每次被调用,要么继续调用自己,要么输出中间数据,简单来讲就是判断一下有没有左链接,如果有,那就继续调用,一直到没有左链接,然后输出当前的数据,再判断是否有右链接,如果有右链接,继续调用方法,重新判断是否有左链接。
在main方法
public static void main(String[] args){
erchashu cs = new erchashu();
cs.add(12);
cs.add(16);
cs.add(18);
cs.add(9);
cs.add(53);
cs.add(45);
cs.print();
}
输出结果
9=>12=>16=>18=>45=>53=>