首页 > 编程语言 >Java中二叉树的遍历、查找

Java中二叉树的遍历、查找

时间:2022-12-07 16:57:39浏览次数:38  
标签:Node 遍历 Java value 二叉树 return null root

1、准备节点

/**
 * 二叉树的节点
 * @author lurenjia
 * @date 2022/12/7-12:07
 */
public class Node {
    Object value;
    Node leftChild;
    Node rightChild;

    public Node(Object o){
        value = o;
    }

    public Node(Object value, Node leftChild, Node rightChild) {
        this.value = value;
        this.leftChild = leftChild;
        this.rightChild = rightChild;
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                ", leftChild=" + leftChild +
                ", rightChild=" + rightChild +
                '}';
    }
}

2、实现对二叉树的操作

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 二叉树实现
 * @author lurenjia
 * @date 2022/12/7-12:10
 */
public class BinaryTree {
    private Node root;//根节点

    public BinaryTree(Node root) {    this.root = root;}

    public BinaryTree() {}

    /**
     * 判断二叉树是否为空,为空返回true
     * @return
     */
    public boolean isEmpty(){   return root==null;}

    /**
     * 中序遍历
     */
    public void LDRtraverse(){
        System.out.print("中序遍历,使用递归实现:");
        this.LDRtraverse(root);
        System.out.println();
    }
    private void LDRtraverse(Node root){
        if(root!=null){
            //1、遍历左子树
            this.LDRtraverse(root.leftChild);
            //2、输出根
            System.out.print(root.value+" ");
            //3、遍历右子树
            this.LDRtraverse(root.rightChild);
        }
    }

    /**
     * 中序遍历二叉树,使用栈(后进先出)实现。
     */
    public void LDRtraverseByStack(){
        System.out.print("中序遍历,使用栈实现:");
        //1、创建栈
        Deque<Node> stack = new LinkedList<>();
        //2、获取根节点
        Node current = root;
        //若根节点不为空,或者栈不为空则进入循环
        while ( current!=null || !stack.isEmpty()){

            //如果不为空节点,则入栈,而后判断左子节点是否存在,存在则入栈,最终左下角的元素在栈首
            while (current!=null){
                stack.push(current);
                current = current.leftChild;
            }
//如果栈不为空,则出栈一个(即左下角元素),节点指向出栈的右子节点 if(!stack.isEmpty()){ current = stack.pop(); System.out.print(current.value+" "); current = current.rightChild; } } System.out.println(); } /** * 获取二叉树的高度 * @return */ public int getHeight(){ return this.getHeight(root); } private int getHeight(Node root){ if(root==null){ return 0; }else{ //1、获取左子树的高度 int nl = this.getHeight(root.leftChild); //2、获取右子树的高度 int nr = this.getHeight(root.rightChild); //3、其中大的高度,加一,获取 return nl>nr?nl+1:nr+1; } } /** * 获取二叉树内节点个数 * @return */ public int size(){ return this.size(root); } private int size(Node root){ if(root==null){ return 0; }else { //1、获取左子树的结点个数 int nl = this.size(root.leftChild); //2、获取右子树的结点个数 int nr = this.size(root.rightChild); //3、返回个数 return nl+nr+1; } } /** * 在树中寻找对应的元素 * @param value * @return */ public Node findKey(Object value){ return this.findKey(value,root); } private Node findKey(Object value,Node root){ if(root==null){//递归头1:为空树 return null; }else if(root!=null&&root.value==value){ //递归头2:找到了目标元素 return root; }else {//递归体 //遍历左子树 Node node1 = this.findKey(value,root.leftChild); //遍历右子树 Node node2 = this.findKey(value,root.rightChild); if(node1!=null&&node1.value==value){ return node1; }else if(node2!=null&&node2.value==value){ return node2; }else {//没找到 return null; } } } /** * 按照层次遍历二叉树,使用队列(先进先出)实现。 */ public void levelOrderByStack(){ System.out.print("按照层次遍历二叉树,使用队列实现:"); if(root==null)return; //1、创建队列 Queue<Node> queue = new LinkedList<>(); //2、根节点入队 queue.add(root); //队列中有元素则进入循环 while (queue.size()!=0){ //按照栈中元素的个数进行出队循环 int len = queue.size(); for(int i = 0;i<len;i++){ //根节点出队 Node temp = queue.poll(); System.out.print(temp.value+" "); //如果根节点有左子节点,左子节点入队 if(temp.leftChild!=null) queue.add(temp.leftChild); //如果根节点有左子节点,左子节点入队 if(temp.rightChild!=null) queue.add(temp.rightChild); } } System.out.println(); } }

3、测试代码: 

/**
 * @author lurenjia
 * @date 2022/12/7-12:23
 */
public class User {
    public static void main(String[] args) {
        //手动创建节点
        Node node7 = new Node("G",null,null);
        Node node4 = new Node("D",null,null);
        Node node5 = new Node("E",node7,null);
        Node node6 = new Node("F",null,null);
        Node node2 = new Node("B",node4,node5);
        Node node3 = new Node("C",null,node6);
        Node node1 = new Node("A",node2,node3);
        //通过根节点创建一个二叉树对象
        BinaryTree btree = new BinaryTree(node1);
        //判断是否为空
        System.out.println("是否为空:"+btree.isEmpty());
        //获取高度
        System.out.println("此二叉树的高度为:"+btree.getHeight());
        //获取节点个数
        System.out.println("此二叉树的节点个数为:"+btree.size());
        //中序遍历,递归实现
        btree.LDRtraverse();
        //中序遍历,
        btree.LDRtraverseByStack();
        //按照层次遍历
        btree.levelOrderByStack();
        //查找指定元素
        System.out.println("查找:"+btree.findKey("E"));
    }
}

 

测试代码中创建的二叉树:

 

 

 

测试结果:

是否为空:false
此二叉树的高度为:4
此二叉树的节点个数为:7
中序遍历,使用递归实现:D B G E A C F 
中序遍历,使用栈实现:D B G E A C F 
按照层次遍历二叉树,使用队列实现:A B C D E F G 
查找:Node{value=E, leftChild=Node{value=G, leftChild=null, rightChild=null}, rightChild=null}

Process finished with exit code 0

 

标签:Node,遍历,Java,value,二叉树,return,null,root
From: https://www.cnblogs.com/lurenjia-bky/p/16963555.html

相关文章

  • 3、二叉树
    树(Tree)是n个结点的有限集合。度:拥有子结点的数量为结点的度,树中最大的度为树的度。结点(节点):根结点、内部结点、叶子结点有序树:左分支和右分支......
  • Day1 JAVASE
    构造器:1.和类名相同2.没有返回值作用:1.new本质在调用构造方法2.初始化对象的值注意点:1.在创建类的时候就会有一个构造器去初始化对象的值,因此new才能创建一个实例......
  • 瀑布流布局 不到30行代码实现(JavaScript + absolute)支持懒加载
    @目录前言一、使用css实现瀑布流布局1.flex布局2.column-count多栏布局3.grid网格布局二、结合JavaScript的瀑布流布局实现1.推荐原因2.实现步骤a.初步实现:结合JavaSc......
  • Java前后端请求Content-Type与接受方式
    1.GetGet方法没有请求体,所以加不加Content-Type没有意义。参数通过拼接到Url来加入url?key=value&key2=value2SpringMVC后台如何获取参数:Java后台通过Request的get......
  • Javascript-极速入门指南-3-jQuery使用教程
    内容概要jQuery类库类库jQuery简介jQuery的宗旨:Writeless,domore写的更少做的更多jQuery的特点为: 1.加载速度快 2.选择器更多更好用 3.一行代码走天下......
  • java 随便的复习
    packagewxy1;publicclassw{ publicstaticvoidmain(Stringargs[]){ //这个是单行注释只可以注释一行; /*这个是多行注释可以注释很多航, *注意:byte也是整数型; ......
  • 力扣540(java&python)-有序数组中的单一元素(中等)
    题目:给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足O(logn)时间复......
  • 现代javascript教程 数组
    array字面量或者构造函数声明数组newArray(100),长度100的空获取数组长度,是一个属性,arr.length获得元素,通过索引值,arr[0]修改数组,arr[0]=0用alert方法打印数组,会......
  • java sql 测试批量插入效率
    四种模式下的批量插入测试响应:插入一万条数据,耗时情况ms:[{"taskName":"循环插入","timeMillis":20771,"timeSeconds":20.771},{"taskName":"......
  • JAVA基础
    JAVA基础命名规范项目名全小写包全小写域名反写:从大到小类 大驼峰命名:每个单词首字母大写,其他字母小写方法小驼峰命名......