【Java数据结构】链式存储的二叉树
链式存储的二叉树
- 二叉树数据结构
- 创建二叉树
- 二叉树的遍历
- 先序遍历
- 中序遍历
- 后序遍历
- 二叉树节点的查找
- 先序查找
- 中序查找
- 后序查找
- 删除二叉树的子树
- 二叉树示例完整代码
- BinaryTree 类
- 测试类 TestBinaryTree
二叉树数据结构
// 二叉树类
public class BinaryTree {// 根节点TreeNode root;// 设置根节点public void setRoot(TreeNode root) {this.root = root;}// 获取根节点public TreeNode getRoot() {return root;}
}
// 二叉树的节点类
class TreeNode{// 权值int value;public TreeNode(int value){this.value = value;}// 左儿子TreeNode leftNode;// 右儿子TreeNode rightNode;// 设置左儿子public void setLeftNode(TreeNode leftNode) {this.leftNode = leftNode;}// 设置右儿子public void setRightNode(TreeNode rightNode) {this.rightNode = rightNode;}
}
创建二叉树
我们将创建如下图的二叉树:
public static void main(String[] args) {// 创建一棵树,一开始为空树BinaryTree binTree = new BinaryTree();// 创建一个根节点TreeNode root = new TreeNode(1);// 给树设置节点binTree.setRoot(root);// 创建根的左儿子节点TreeNode rootL = new TreeNode(2);// 将新创建的节点设为根的左儿子root.setLeftNode(rootL);// 创建根的右儿子节点TreeNode rootR = new TreeNode(3);// 将新创建的节点设为根的右儿子root.setRightNode(rootR);// 为第二层的左节点创建两个子节点rootL.setLeftNode(new TreeNode(4));rootL.setRightNode(new TreeNode(5));// 为第二层的右节点创建两个子节点rootR.setLeftNode(new TreeNode(6));rootR.setRightNode(new TreeNode(7)); }
二叉树的遍历
由上面的图可知,
先序遍历为:1 2 4 5 3 6 7
中序遍历为:4 2 5 1 6 3 7
后序遍历为:4 5 2 6 7 3 1
先序遍历
// 先序遍历,BinaryTree 对象的方法
public void frontShow() {if (root != null){root.frontShow();}
}
-------------------------------------------------------------------------------------------
// 先序遍历,TreeNode 对象的方法
public void frontShow() {// 根System.out.print(value + " ");// 左节点if (leftNode != null)leftNode.frontShow();// 右节点if (rightNode != null)rightNode.frontShow();
}
中序遍历
// 中序遍历,BinaryTree 对象的方法
public void midShow() {if (root != null){root.midShow();}
}
-------------------------------------------------------------------------------------------
// 中序遍历,TreeNode 对象的方法
public void midShow(){// 左if (leftNode != null)leftNode.midShow();// 根System.out.print(value + " ");//右if (rightNode != null)rightNode.midShow();
}
后序遍历
// 后序遍历,BinaryTree 对象的方法
public void afterShow() {if (root != null){root.afterShow();}
}
-------------------------------------------------------------------------------------------
// 后序遍历,TreeNode 对象的方法
public void afterShow(){// 左if (leftNode != null)leftNode.afterShow();// 右if (rightNode != null)rightNode.afterShow();// 根System.out.print(value + " ");
}
二叉树节点的查找
先序查找
// 先序查找,BinaryTree 对象的方法
public TreeNode frontSearch(int i) {return root.frontSearch(i);
}
-------------------------------------------------------------------------------------------
// 先序查找,TreeNode 对象的方法
public TreeNode frontSearch(int i) {TreeNode target = null;if (this.value == i){return this;}if (leftNode != null){target = leftNode.frontSearch(i);}if (target != null){return target;}if (rightNode != null) {target = rightNode.frontSearch(i);}return target;
}
中序查找
// 中序查找,BinaryTree 对象的方法public TreeNode midSearch(int i) {return root.midSearch(i);}
-------------------------------------------------------------------------------------------
// 中序查找,TreeNode 对象的方法
public TreeNode midSearch(int i){TreeNode target = null;if (leftNode != null){target = leftNode.midSearch(i);}if (target != null){return target;}if (this.value == i){return this;}if (rightNode != null){target = rightNode.midSearch(i);}return target;
}
后序查找
// 后序查找,BBinaryTree 对象的方法
public TreeNode afterSearch(int i) {return root.afterSearch(i);
}
-------------------------------------------------------------------------------------------
// 后序查找,TreeNode 对象的方法
public TreeNode afterSearch(int i) {TreeNode target = null;if (leftNode != null){target = leftNode.afterSearch(i);}if (target != null){return target;}if (rightNode != null){target = rightNode.afterSearch(i);}if (target != null){return target;}if (this.value == i){return this;}return target;
}
删除二叉树的子树
// 删除二叉树的子树,BinaryTree 对象的方法
public void delete(int i) {if (root.value == i){root = null;return;}else{root.delete(i);}
}
-------------------------------------------------------------------------------------------
// 删除二叉树的子树,TreeNode 对象的方法
public void delete(int i) {TreeNode parent = this;// 判断左儿子if (parent.leftNode != null && parent.leftNode.value == i){parent.leftNode = null;return;}// 判断右儿子if (parent.rightNode != null && parent.rightNode.value == i){parent.rightNode = null;return;}// 递归检查并删除左儿子parent = leftNode;if (parent != null){parent.delete(i);}// 递归检查并删除右儿子parent = rightNode;if (parent != null){parent.delete(i);}
}
二叉树示例完整代码
BinaryTree 类
package com.yusael.Tree2;public class BinaryTree {// 根节点TreeNode root;// 设置根节点public void setRoot(TreeNode root) {this.root = root;}// 获取根节点public TreeNode getRoot() {return root;}// 先序遍历public void frontShow() {if (root != null){root.frontShow();}}// 中序遍历public void midShow() {if (root != null){root.midShow();}}// 后序遍历public void afterShow() {if (root != null){root.afterShow();}}// 先序查找public TreeNode frontSearch(int i) {return root.frontSearch(i);}// 中序查找public TreeNode midSearch(int i) {return root.midSearch(i);}// 后序查找public TreeNode afterSearch(int i) {return root.afterSearch(i);}// 删除二叉树的子树public void delete(int i) {if (root.value == i){root = null;return;}else{root.delete(i);}}
}// 二叉树的节点类
class TreeNode{// 权值int value;public TreeNode(int value){this.value = value;}// 左儿子TreeNode leftNode;// 右儿子TreeNode rightNode;// 设置左儿子public void setLeftNode(TreeNode leftNode) {this.leftNode = leftNode;}// 设置右儿子public void setRightNode(TreeNode rightNode) {this.rightNode = rightNode;}// 先序遍历public void frontShow() {// 根System.out.print(value + " ");// 左节点if (leftNode != null)leftNode.frontShow();// 右节点if (rightNode != null)rightNode.frontShow();}// 中序遍历public void midShow(){// 左if (leftNode != null)leftNode.midShow();// 根System.out.print(value + " ");//右if (rightNode != null)rightNode.midShow();}// 后序遍历public void afterShow(){// 左if (leftNode != null)leftNode.afterShow();// 右if (rightNode != null)rightNode.afterShow();// 根System.out.print(value + " ");}// 先序查找public TreeNode frontSearch(int i) {TreeNode target = null;if (this.value == i){return this;}if (leftNode != null){target = leftNode.frontSearch(i);}if (target != null){return target;}if (rightNode != null) {target = rightNode.frontSearch(i);}return target;}// 中序查找public TreeNode midSearch(int i){TreeNode target = null;if (leftNode != null){target = leftNode.midSearch(i);}if (target != null){return target;}if (this.value == i){return this;}if (rightNode != null){target = rightNode.midSearch(i);}return target;}// 后序查找public TreeNode afterSearch(int i) {TreeNode target = null;if (leftNode != null){target = leftNode.afterSearch(i);}if (target != null){return target;}if (rightNode != null){target = rightNode.afterSearch(i);}if (target != null){return target;}if (this.value == i){return this;}return target;}// 删除二叉树的子树public void delete(int i) {TreeNode parent = this;// 判断左儿子if (parent.leftNode != null && parent.leftNode.value == i){parent.leftNode = null;return;}// 判断右儿子if (parent.rightNode != null && parent.rightNode.value == i){parent.rightNode = null;return;}// 递归检查并删除左儿子parent = leftNode;if (parent != null){parent.delete(i);}// 递归检查并删除右儿子parent = rightNode;if (parent != null){parent.delete(i);}}
}
测试类 TestBinaryTree
public class TestBinaryTree {public static void main(String[] args) {// 创建一颗树BinaryTree binTree = new BinaryTree();// 创建一个根节点TreeNode root = new TreeNode(1);// 把根结点赋给树binTree.setRoot(root);// 创建根的左儿子节点TreeNode rootL = new TreeNode(2);// 将新创建的节点设为根结点的左儿子root.setLeftNode(rootL);// 创建根的右儿子节点TreeNode rootR = new TreeNode(3);// 将新创建的节点设为根结点的右儿子root.setRightNode(rootR);// 为第二层的左节点创建两个子节点rootL.setLeftNode(new TreeNode(4));rootL.setRightNode(new TreeNode(5));// 为第二层的右节点创建两个子节点rootR.setLeftNode(new TreeNode(6));rootR.setRightNode(new TreeNode(7));System.out.println("**************以上为创建二叉树*************");// 先序遍历System.out.print("先序遍历:");binTree.frontShow();System.out.println();// 中序遍历System.out.print("中序遍历:");binTree.midShow();System.out.println();// 后序遍历System.out.print("后序遍历:");binTree.afterShow();System.out.println();System.out.println("*************以上为二叉树的遍历**************");// 先序查找TreeNode treeNode1 = binTree.frontSearch(3);System.out.println(treeNode1 == rootR);// 中序查找TreeNode treeNode2 = binTree.midSearch(5);System.out.println(treeNode2);// 后序查找TreeNode treeNode3 = binTree.afterSearch(8);System.out.println(treeNode3);System.out.println("**************以上为二叉树的查找*************");// 删除一个子树binTree.delete(5);System.out.println("删除一个子树后的先序遍历:");binTree.frontShow();System.out.println();System.out.println("**************以上为删除二叉树的子树*************");}
}
**************以上为创建二叉树*************
先序遍历:1 2 4 5 3 6 7
中序遍历:4 2 5 1 6 3 7
后序遍历:4 5 2 6 7 3 1
*************以上为二叉树的遍历**************
true
com.yusael.Tree.TreeNode@1b6d3586
null
**************以上为二叉树的查找*************
删除一个子树后的先序遍历:
1 2 4 3 6 7
**************以上为删除二叉树的子树*************
【Java数据结构】链式存储的二叉树相关推荐
- Java实现链式存储的二叉树节点的定义
public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.va ...
- 线性链表java实现_线性表的Java实现--链式存储(双向链表)
线性表的Java实现--链式存储(双向链表) 有了单向链表的基础,双向链表的实现就容易多了. ? 双向链表的一般情况: ? ? class="decoded" alt=" ...
- java链式存储_Java实现链式存储的二叉树
importjava.util.LinkedList;importjava.util.List;importjava.util.Queue;importjava.util.Stack;/***@aut ...
- 数据结构——链式存储结构
文章目录 前言 一.链式存储结构 二.相关术语 1.结点 2.链表 3.单链表 4.双链表 5.循环链表 6.头指针 7.首元结点 三.单链表 1.单链表的实现 2.单链表的初始化 3.单链表的销毁 ...
- 数据结构--链式存储结构
通过对之前学过的线性表进行时间复杂度分析总结出顺序存储结构线性表的最大问题就是插入和删除需要移动大量的元素,严重影响了效率.为了提高效率,引出一种在逻辑结构上相连但在物理结构上不相连的存储方式--链式 ...
- 数据结构——链式存储
目录 前言 求表长 从链表中查找 按照序号查找 按照值查找 插入操作 删除操作 前言 链式存储,即链表,是一种常用.方便的存储方式.链表这种方法可以在多个语言中使用,具有一定抽象性. 一般对链表进行的 ...
- C++实现链式存储线索二叉树
一颗线索二叉树: 根据下图进行节点的创建: 代码如下: #include <iostream> using namespace std; typedef char ElemType;typ ...
- 线性表的Java实现--链式存储(双向链表)
有了单向链表的基础,双向链表的实现就容易多了. 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现: package com.liuhao.algorithm; public cla ...
- c语言二叉树链式存储,C语言 二叉树的链式存储实例
二叉树的链式存储 实现二叉树的基本操作:建立.遍历.计算深度.结点数.叶子数等. 输入C,先序创建二叉树,#表示空节点: 输入H:计算二叉树的高度: 输入L:计算二叉树的叶子个数: 输入N:计算二叉树 ...
最新文章
- oracle 10g 连接语句,Oracle 10g数据库基础之基本查询语句-下-连接子查询
- [转贴]无刷新的2个DropDownList联动
- 用特征迭代次数区分minst数据集的0和1
- python如何使用apriori_python-如何加快基于Apriori框架的速度,以仅生...
- Neo4j实战 (数据库技术丛书)pdf
- Java中避免if-else-if:策略模式
- 用U盘或移动硬盘安装Windows7 (超简单制作Win7安装U盘方法)
- 使用Material Design的Flutter应用
- 2乘2数组第一维_苏教版三年级下册 第一单元“两位数乘两位数”第2课
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_5、SpringBoot2.x的依赖默认Maven版本...
- Linux常用文档操作命令--2
- IE、Firefox和 Chrome长时间打开后内存都会变很大。
- duilib的通用窗口类WindowImplBase
- linux下python网络编程框架-twisted安装手记,Linux下Python网络编程框架-Twisted安装手记 | 学步园...
- 抖音短视频如何快速制作?抖音怎么赚钱?
- 统计检验 单尾还是双尾
- MacBook通过MacBook安装Windows系统出现“下载windows支持软件时未能储存到所选驱动器”
- PHP微信公众号网页授权登录 扫码登录 获取用户基本信息
- 高德地图哪个语音包最好_贪玩蓝月语音包 高德地图语音包哪个好
- 前员工推出新搜索引擎Cuil挑战Google