java实现二叉树的Node节点定义手撕8种遍历(一遍过)

Python微信订餐小程序课程视频

https://blog.csdn.net/m0_56069948/article/details/122285951

Python实战量化交易理财系统

https://blog.csdn.net/m0_56069948/article/details/122285941

java实现二叉树的Node节点定义手撕8种遍历(一遍过)

java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍历,非递归前序遍历,非递归前序遍历,到最后的广度优先遍历和深度优先遍历

1.Node节点的Java实现

首先在可以看到打上Node这个字符串,就可以看到只能的IDEA系统提供的好多提示:

txt

点进去看,却不是可以直接构成二叉树的Node,不是我们需要的东西。这里举个例子来看org.w3c.dom
这里面的Node是一个接口,是解析XML时的文档树。在官方文档里面看出:
该 Node 接口是整个文档对象模型的主要数据类型。它表示该文档树中的单个节点。
当实现 Node 接口的所有对象公开处理子节点的方法时,不是实现 Node 接口的所有对象都有子节点。
  • 所以我们需要自定义一个Node类

java

package com.elloe.实现二叉树的Node节点.Node的Java实现;

import java.util.LinkedList;
import java.util.Stack;

/**
 * @author ElloeStudy(Sifa Zhang)
 * @create 2022-04-09 13:04
 * To: 真常应物,真常得性,常清常静,常清静矣
 *
 * 自定义Node的节点
 */
public class Node {
    private int value;    // 节点的值
    private Node node;   // 当前节点
    private Node left;  // 此节点的左节点,类型为Node
    private Node right; // 此节点的右节点,数据类型为Node

    public Node() {
    }

    public Node(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getNode() {
        return node;
    }

    public void setNode(Node node) {
        this.node = node;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }

    @Override
    public String toString(){
        return this.value + " ";
    }
}

2.数组升华二叉树

一般拿到的数据是一个int型的数组,那怎么将这个数组变成我们可以直接操作的树结构呢?

1、数组元素变Node类型节点
2、给N/2-1个节点设置子节点
3、给最后一个节点设置子节点【有可能只有左节点】

那现在就直接上代码:

java

public static void create(int[] datas, List list){
  // 将数组的数装换为节点Node
  for (int i = 0; i < datas.length; i++) {
    Node node = new Node(datas[i]);
    node.setNode(node);
    list.add(node);
  }

  // 节点关联树
  for (int index = 0; index < list.size()/2 - 1; index++) {
    //编号为n的节点他的左子节点编号为2*n 右子节点编号为2*n+1 但是因为list从0开始编号,所以还要+1
    list.get(index).setLeft(list.get(index * 2 + 1));
    list.get(index).setRight(list.get(index * 2 + 2));
  }

  // 单独处理最后一个节点,list.size()/2 -1 进行设置,避免单孩子情况
  int index = list.size()/2 - 1;
  list.get(index).setLeft(list.get(index * 2 + 1));
  if (list.size()%2 == 1){
    // 如果有奇数个节点,最后一个节点才有右节点
    list.get(index).setRight(list.get(index * 2 + 2));
  }
}

很细致的加上了很多的注释啊,所以保证一看就懂。

3.递归前序遍历

具体的原理没有什么好讲的,知道顺序即可

先序遍历过程:
(1)访问根节点;
(2)采用先序递归遍历左子树;
(3)采用先序递归遍历右子树;

这里用图来说明:

先序的结果:1 2 4 8 9 5 3 6 7

代码实现:

java

// 传入需要遍历的节点
public void preTraversal(Node node){
  // 当遇到叶节点,停止向下遍历
  if (node == null){
    return;
  }
  // 相当于点前节点的根节点的值
  System.out.print(node.getValue() + " ");
  // 先从底下依次遍历左节点
  preTraversal(node.getLeft());
  // 先从底下依次遍历右节点
  preTraversal(node.getRight());
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值