超详细的有序二叉树构建过程

有序二叉树的构建

第一个节点是空节点,如果新插入的数比节点小,则放在左边,如果比节点大,放在右边。

构建节点的方法

利用递归的方式进行构建

利用非递归的方式进行构建--循环遍历

插入节点的步骤

1.首先判断节点和要插入的节点的值的大小

2.如果当前节点大,那么新插入的节点向判断当前节点的左子树是否有数据,

3.如果没有数据则直接插入,如果有数据,向左走,重复上述1.2步

4.如果当前节点小,那么新插入的节点向判断当前节点的右子树是否有数据,

3.如果没有数据则直接插入,如果有数据,向右走,重复上述1.2步

如果要构建一棵树,首先要构建树的节点

java是如何构建节点的?

对于C语言,可以通过利用结构体构建

java利用类与对象,java的一个节点就是一个对象,类是构建对象的模板

程序流程:

5 7 9 4

首先main方法入栈,创建一个tree对象,首先在tree对象中有一个全局变量root

然后不断地调入方法入栈,首先调入insert方法入栈

insert方法首先会创建一个对象newNode,内存中会分配给该对象,一个内存空间

然后盘对root是否为空,如果为空,那么j就将newNode对应地地址分配给root对象

if(root==null) {

root = newNode;

return;//确定节点位置,程序结束

}

这个语句中=前面是变量,等号后面的是地址值。

这一步相当于创建了一个节点5,而且有一个root指针指向当前节点。

构建到此,insert(5)的方法出栈

然后重新调用一个新的insert方法,insert(7)入栈

然后我们比较新加入的节点值和root节点值的大小,7>5,继续判断root的右节点值是否为空,如果为空,直接插入,即将的新节点的地址值赋给root右节点

方法出栈,insert(9)调入进栈

再次新创建变量newNode并给它分配空间

需要一个指针,帮助我们进行数据

定义了一个tempNode,将root对应的地址赋给tempNode,然后比较5和7 的值的大小

发现5的右边为空,所以直接挂上去,接下来是9

此时tempNode指向5,然后比较5和9的值,发现5>9,所以在观察5的右节点是否为空,发现不为空,这个时候需要7和9进行比较,所以将tempNode指向7,即将7的地址值赋给tempNode

tempNode=tempNode.rightNode

然后重新进行判断,9和7再次进行比较,9>7,并且7的右节点为空,将9的地址值赋给7的右节点,实现插入

insert(9)出栈,insert(4)入栈

创建一个新节点newNode

tempNode再次指向root,然后tempNode指向的5和4进行比较,发现4

while(newNode.data

if (tempNode.leftNode==null) {//如果根节点的右子树为空

root.leftNode=newNode;

return;

}else {

tempNode=tempNode.leftNode;//将左侧节点的地址赋给tempnode

//重新向左边进行比较

}

首先判断5的左节点是否为空,如果为空,将新节点的地址值赋给5的左节点

然后insert(4)出栈,insert(3)入栈

判断3小于5,并且5的左节点不为空,将5的左节点4的地址值赋给tempNode,继续进行判断,3小于4,并且4的左侧节点为空,直接插入。

package com.tree;

public class Tree {
 public TreeNode root;//指针,指向根节点
 
 public void insert(int value) {
     TreeNode newNode=new TreeNode(value);
         if(root==null) {
             root=newNode;
             return;//确定节点位置,程序结束
         }
         //创建一个指针,让指针帮助我们进行数据对比
         TreeNode tempNode=root;//将root地址付给tempNode
         while(true) {
          while(newNode.data>tempNode.data) {
             if (tempNode.rightNode==null) {//如果根节点的右子树为空
                 root.rightNode=newNode;
                 return;
             }else {
                tempNode=tempNode.rightNode;//将右侧节点的地址赋给tempnode
                 //重新向右边进行比较
             }
          }
          while(newNode.data<=tempNode.data) {
             if (tempNode.leftNode==null) {//如果根节点的右子树为空
                 root.leftNode=newNode;
                 return;
             }else {
                tempNode=tempNode.leftNode;//将左侧节点的地址赋给tempnode
                 //重新向左边进行比较
             }
          }
        }
     }
 }

看完这篇文章,别忘了点击收藏,加关注呦

你就是未来大佬

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值