链式二叉树的实现(Java)
定义树节点:
package 链式二叉树;
public class TreeNode {
private Object data;
private TreeNode left;
private TreeNode right;
public TreeNode() {
this.data = null;
this.left = null;
this.right = null;
}
public TreeNode(Object data, TreeNode left, TreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
public Object getData() {
return this.data;
}
public void setData(Object data) {
this.data = data;
}
public TreeNode getLeft() {
return this.left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return this.right;
}
public void setRight(TreeNode right) {
this.right = right;
}
}
二叉树实现:
package 链式二叉树;
public class BinaryTree {
public TreeNode root;
public BinaryTree(TreeNode root) {
this.root = root;
}
public BinaryTree() {
this.root = null;
}
public TreeNode getRoot() {
return this.root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
//前序遍历
public void preorder(TreeNode root) {
if(root != null) {
System.out.println(root.getData());
preorder(root.getLeft());
preorder(root.getRight());
}
}
//中序遍历
public void middleorder(TreeNode root) {
if(root != null) {
middleorder(root.getLeft());
System.out.println(root.getData());
middleorder(root.getRight());
}
}
//后序遍历
public void postorder(TreeNode root) {
if(root != null) {
postorder(root.getLeft());
postorder(root.getRight());
System.out.println(root.getData());
}
}
//获得父节点
public TreeNode getParent(TreeNode ele) {
return (root == null || ele == ele) ? null : parent(root, ele);
}
private TreeNode parent(TreeNode root, TreeNode e) {
if(root == null) return null;
if(root.getLeft() == e || root.getRight() == e) return root;
TreeNode t;
return ((t = parent(root.getLeft(), e)) != null) ? t : parent(root.getRight(), e);
}
//获得节点个数
public int getSize() {
return length(root);
}
private int length(TreeNode root) {
return root == null ? 0 : (length(root.getLeft()) + length(root.getRight()) + 1);
}
//获得树的深度
public int getDepth() {
return depth(root);
}
private int depth(TreeNode root) {
if(root == null) return 0;
int m = depth(root.getLeft());
int n = depth(root.getRight());
return m > n ? m+1 : n+1;
}
public static void main(String[] args) {
TreeNode l12 = new TreeNode("left12", null, null);
TreeNode r12 = new TreeNode("right12", null, null);
TreeNode l22 = new TreeNode("left22", null, null);
TreeNode r22 = new TreeNode("right22", null, null);
TreeNode l1 = new TreeNode("left1", l12, r12);// 根节点左子树
TreeNode r1 = new TreeNode("right1", l22, r22);// 根节点右子树
TreeNode root = new TreeNode("root", l1, r1);// 创建根节点
BinaryTree bt = new BinaryTree(root);
// System.out.println("=======先序遍历======");
// bt.preorder(bt.getRoot());
// System.out.println("=======中序遍历======");
// bt.middleorder(bt.getRoot());
System.out.println("深度:"+ bt.getDepth());
}
}
链式二叉树的实现(Java)的更多相关文章
- UVa 122 Trees on the level(链式二叉树的建立和层次遍历)
题目链接: https://cn.vjudge.net/problem/UVA-122 /* 问题 给出每个节点的权值和路线,输出该二叉树的层次遍历序列. 解题思路 根据输入构建链式二叉树,再用广度优 ...
- (三)使用链式数据实现包(java)
目标: 1) 描述数据的链式组织方式 2) 描述如何在链式节点链的开头添加新节点 3) 描述如何删除链式节点链的首节点 4) 描述如何在链式节点链中找到某个数据 5) 使用链式节点链实现ADT包 6) ...
- C_数据结构_链式二叉树
# include <stdio.h> # include <malloc.h> struct BTNode { int data; struct BTNode * pLchi ...
- C语言实现链式二叉树静态创建,(先序遍历),(中序遍历),(后续遍历)
#include <stdio.h>#include <stdlib.h> struct BTNode{ char data ; struct BTNode * pLchild ...
- C#数据结构-二叉树-链式存储结构
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...
- [数据结构 - 第6章] 树之链式二叉树(C语言实现)
一.什么是二叉树? 1.1 定义 二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序. 1.2 二叉树的重要特性 (1)二叉树的第 i 层上节点数最多为 2n-1: (2)高 ...
- Java实现链式存储的二叉树
二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...
- Java实现链式存储的二叉查找树(递归方法)
二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字: 2. 若右子树非空,则右子树上所有节点关键字值 ...
- 【Java】子类的链式调用
记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...
随机推荐
- iOS7的iBeacon初步使用
iBeacon是iOS7的新增的功能,通过BLE实现室内定位,精确到厘米级别. 测试使用两台iPhone(支持BLE),一台作为iBeacon基站广播信号,代码使用官方源码AirLocate,另外一台 ...
- php function 按引用返回一个值
按引用返回一个值,而不是按值返回,这样就无需为变量建立一个重复的副本 function &array_find_value($needle, &$haystack) { foreach ...
- 有关jQuery valid 验证多个同name属性的input的问题
今天遇到需要动态添加多个同name属性的input框,用jQuery valid进行验证时,没有指定不同的id,验证只会在第一个显示提示信息,因为jQuery valid显示的提示信息是根据每个inp ...
- boost之内存管理
内存管理一直是令C++程序员最头疼的工作,C++继承了C那高效而又灵活的指针,使用起来稍微不小心就会导致内存泄露.野指针.越界访问等访问.虽然C++标准提供了只能指针std::auto_ptr,但是并 ...
- abp CrudAppService 自定义分页、排序
public class GetAllTasksInput : PagedAndSortedResultRequestDto { public TaskState? State { get; set; ...
- jquery中prop()和attr()的区别
相比attr,prop是1.6.1才新出来的,两者从中文意思理解,都是获取/设置属性的方法(attributes和properties).只是,window或document中使用.attr()方法在 ...
- jquery.fn.extend() 与 $.jquery 作用及区别
原文:http://www.cnblogs.com/liu-l/p/3928373.html jQuery.extend()这个方法,主要是用来拓展个全局函数啦,例如$.ajax()这种,要不就是拓展 ...
- CMake使用技巧集
1.注意CMake不允许出现相同的目标名称,即使是不同的目录下的CMakeLists.txt 2.将头文件搜索路径插入到其它的前面: include_directories(BEFORE /tmp) ...
- Xcode使用心得01:断点中断问题和调整编译目标[转]
在obj-c系列博文里,我们粗浅的介绍了obj-c的一些语法以及F库中的一些标准类的使用,但是实际编写拿得出手的APP还是得老老实实在os x上用Xcode写啊!最近上网无意中发现还有支持os x和i ...
- 代码修改之后MSbuild编译不出最新的dll解决方法
问题: 使用jenkins发布的时候,开发不断反馈自己修改的文件使用jenkins没有发布到测试环境.经过查证发现使用MSBUILD编译的时出现修改的文件编译出的日期不是最新日期,但是使用VS编译就不 ...