热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

建立二叉树的两种方法。

1.数组表示法利用数组来存储二叉树的元素。建立二叉树的规则:小于等于父节点的值放在左子节点,大于父节点的值放在右子节点。代码如下:***需求:使用一维数组存储二叉树步骤:1、查看原



1.数组表示法

利用数组来存储二叉树的元素。
建立二叉树的规则:小于等于父节点的值放在左子节点,大于父节点的值放在右子节点。

代码如下:

/***



  • 需求:使用一维数组存储二叉树



  • 步骤:



  • 1、查看原始数据的个数(8个),从而制定二叉树层级(4层),得到满二叉树节点个数(15个)



  • 2、二叉树节点(15个)为一维数组,全设置为0



  • 3、循环遍历原始数据,第一个值为树根



  • 4、第二个值与父节点比较,如果大于树根,则往右子树比较,如果数组内的值小于或等于树根,则往左子树比较



  • 5、【循环】步骤4,直到形成二叉树




  • 备注:左节点的坐标等于父节点的坐标2,右节点的坐标等于父节点的坐标2+1

    /

    package 建立二叉树_数组表示法;

    import java.io.
    ;

    public class demoBinTree{

    public static void main(String args[]) throws IOException

    {

    int i,level;

    int data[]={6,3,5,9,7,8,4,2}; /原始数组/

    int btree[]=new int[16];

    for(i=0;i<16;i++) btree[i]=0;

    System.out.print(“原始数组内容: \n”);

    for(i=0;i<8;i++)

    System.out.print("["+data[i]+"] “);

    System.out.println();

    for(i=0;i<8;i++) /把原始数组中的值逐一对比/

    {

    System.out.println(“i==>”+i);

    for(level=1;btree[level]!=0;) /比较树根及数组内的值/

    {

    System.out.println(“levele==>”+level+” btree[level]==>"+btree[level]);

    if(data[i]>btree[level]) /*如果数组内的值大于树根,则往右子树比较*/
    level=level*2+1;
    else /*如果数组内的值小于或等于树根,则往左子树比较*/
    level=level*2;
    } /*如果子树节点的值不为0,则再与数组内的值比较一次*/
    System.out.println();
    btree[level]=data[i]; /*把数组值放入二叉树*/
    System.out.print("level后==>"+level+" ");
    }
    System.out.print("二叉树内容:\n");
    for (i=1;i<16;i++)
    System.out.print("["+btree[i]+"] ");
    System.out.print("\n");
    }


}

/*自己的困惑



  • 1.level为什么从一开始。

  • 2.不清楚整个循环是如何进行的。

  • 3.不清楚 for(level=1;btree[level]!=0;)这条语句,

  • 4.不清楚每次循环之后level的值是多少,也就是不明白循环。

  • 总结:

  • 就是每次从根节点开始与数组的值比较,大于根节点与其右子树比较,再把右子树当做子树的根节点继续比较,直到遇到叶子节点就结束循环(小于或等于与左子树比较,后面步骤类似)。

  • */


2.链表表示法

顾名思义,用链表来存储二叉树,最简的二叉链表。
代码如下:

/program description==/

//自己对于这个算法还是不太了解,主要是建树的那两个地方。那两个指针是如何工作的,里面存放的是什么。那个参数是如何传递的。

//以上都设计到了程序的运行次序以及构造方法的知识,自己还需要去学习,这里就不深究,留个疑问先。

package 建立二叉树_列表表示法;

import java.io.*;

//二叉树结点类声明

class TreeNode{

int value;

TreeNode left_Node;

TreeNode right_Node;

//TreeNode构造函数

public TreeNode(int value){

this.value = value;

this.left_Node = null;

this.right_Node = null;

}

}

//二叉树类声明。

class BinaryTree{

public TreeNode rootNode; //二叉树的根节点。

public BinaryTree(int[]data){ //构造函数,利用参数建立二叉树

for(int i = 0;i
Add_Node_To_Tree(data[i]);

}

}

void Add_Node_To_Tree(int value){

TreeNode currentNode = rootNode;

if(rootNodenull){ //建立树根

rootNode = new TreeNode(value);

return;

}

//建立二叉树。

while(true){

if(value
if(currentNode.left_Node
null){

currentNode.left_Node = new TreeNode(value);

return;

}

else currentNode = currentNode.left_Node;

}

else{

if(currentNode.right_Node==null){ //在右子树。

currentNode.right_Node = new TreeNode(value);

return;

}

else currentNode = currentNode.right_Node;

}

}

}

}

public class demoBinaryTree {

//主函数。

public static void main(String[] args)throws IOException {

int ArraySize = 10;

int tempdata;

int [] cOntent= new int [ArraySize];

BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));

System.out.println(“请连续输入”+ArraySize+“个数据”);

for(int i = 0;i
System.out.println(“请输入第”+(i+1)+“个数据”);

tempdata = Integer.parseInt(keyin.readLine());

content[i] = tempdata; //将值传递给数组。

}

new BinaryTree(content); //将数组的值传递给二叉树。

System.out.println("=以链表的形式建立二叉树,成功!!!=");

}

}




推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
炜一爱妮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有