根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建、搜索、删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度和其它的一些方法等完成了再继续更新:

二叉树的java实现:

 package com.peter.java.dsa.common;

 import java.util.ArrayList;

 public class BinaryTree {
private TreeNode root;
private int size = 0; public BinaryTree() {
// TODO Auto-generated constructor stub
} public BinaryTree(int value) {
// TODO Auto-generated constructor stub
this.root = new TreeNode(value);
this.size = 1;
} public TreeNode getRoot() {
return root;
} public int getMax() {
TreeNode node = root;
while (node.rightChildNode != null) {
node = node.rightChildNode;
}
return node.value;
} public int getMin() {
TreeNode node = root;
while (node.leftChildNode != null) {
node = node.leftChildNode;
}
return node.value;
} public void preOrderTreeWalk(TreeNode node, ArrayList<Integer> container) {
if (node != null) {
container.add(node.value);
preOrderTreeWalk(node.leftChildNode, container);
preOrderTreeWalk(node.rightChildNode, container);
}
} public void midOrderTreeWalk(TreeNode node, ArrayList<Integer> container) {
if (node != null) {
midOrderTreeWalk(node.leftChildNode, container);
container.add(node.value);
midOrderTreeWalk(node.rightChildNode, container);
}
} public void postOrderTreeWalk(TreeNode node, ArrayList<Integer> container) {
if (node != null) {
postOrderTreeWalk(node.leftChildNode, container);
postOrderTreeWalk(node.rightChildNode, container);
container.add(node.value);
}
} public TreeNode search(int value) {
TreeNode node = root;
while (node.value != value) {
if (value < node.value) {
node = node.leftChildNode;
} else {
node = node.rightChildNode;
}
if (node == null) {
node = null;
}
}
return node;
} private TreeNode findParentNode(int value) {
TreeNode parent = null;
TreeNode node = root;
while (node.value != value) {
parent = node;
if (value < node.value) {
node = node.leftChildNode;
} else {
node = node.rightChildNode;
}
if (node == null) {
node = null;
parent = null;
}
}
return parent;
} public void createBinaryTree(int[] data) {
if (data != null) {
for (int i : data) {
insert(i);
}
}
} public void insert(int value) {
if (root == null) {
root = new TreeNode(value);
} else {
TreeNode curNode = root;
TreeNode parentNode;
while (true) {
parentNode = curNode;
if (value < curNode.value) {
curNode = curNode.leftChildNode;
if (curNode == null) {
parentNode.leftChildNode = new TreeNode(value);
parentNode.leftChildNode.leftOrRight = -1;
break;
}
} else {
curNode = curNode.rightChildNode;
if (curNode == null) {
parentNode.rightChildNode = new TreeNode(value);
parentNode.rightChildNode.leftOrRight = 1;
break;
}
}
}
}
++size;
} public boolean delete(int value) {
boolean flag = false;
TreeNode node = search(value);
TreeNode parent = findParentNode(value);
if (node != null) {
if (node.equals(root)) {
root = null;
}
if (node.leftChildNode == null && node.rightChildNode == null) {
if (node.leftOrRight == 1) {
node = null;
parent.rightChildNode = null;
}
if (node.leftOrRight == -1) {
node = null;
parent.leftChildNode = null;
}
} else if (node.leftChildNode != null
&& node.rightChildNode != null) {
TreeNode successor = findSuccessor(node);
if (node.leftOrRight == -1) {
parent.leftChildNode = successor;
parent.leftChildNode.leftOrRight = -1;
}
if (node.leftOrRight == 1) {
parent.rightChildNode = successor;
parent.rightChildNode.leftOrRight = 1;
}
successor.leftChildNode = node.leftChildNode;
} else {
if (node.leftChildNode != null) {
if (node.leftOrRight == 1) {
parent.rightChildNode = node.leftChildNode;
}
if (node.leftOrRight == -1) {
parent.leftChildNode = node.leftChildNode;
}
}
if (node.rightChildNode != null) {
if (node.leftOrRight == 1) {
parent.rightChildNode = node.rightChildNode;
}
if (node.leftOrRight == -1) {
parent.leftChildNode = node.rightChildNode;
}
}
node = null;
}
flag = true;
--size;
}
return flag;
} private TreeNode findSuccessor(TreeNode delNode) {
TreeNode parent = delNode;
TreeNode successor = delNode;
TreeNode curNode = delNode.rightChildNode; while (curNode != null) {
parent = successor;
successor = curNode;
curNode = curNode.leftChildNode;
}
if (!successor.equals(delNode.rightChildNode)) {
parent.leftChildNode = successor.rightChildNode;
successor.rightChildNode = delNode.rightChildNode;
}
return successor;
} public int size() {
return this.size;
} public boolean isEmpty() {
// TODO Auto-generated method stub
return size == 0;
} public class TreeNode {
int leftOrRight = 0;// 0: root;-1:left child node;1, right childe node;
Integer value;
TreeNode leftChildNode;
TreeNode rightChildNode; public TreeNode(Integer value) {
// TODO Auto-generated constructor stub
this.value = value;
} @Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (obj instanceof TreeNode) {
TreeNode node = (TreeNode) obj;
return node.value == this.value;
}
return false;
} @Override
public String toString() {
return "TreeNode [leftOrRight="
+ leftOrRight
+ ", value="
+ value
+ (leftChildNode != null ? ", leftChildNode="
+ leftChildNode : "")
+ (rightChildNode != null ? ", rightChildNode="
+ rightChildNode : "") + "]";
}
}
}

测试代码如下:

 package com.peter.java.dsa.test;

 import java.util.ArrayList;
import java.util.Arrays; import com.peter.java.dsa.common.BinaryTree;
import com.peter.java.dsa.common.BinaryTree.TreeNode; public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data = { 21, 25, 16, 32, 22, 19, 13, 20 };
System.out.println("input: " + Arrays.toString(data));
BinaryTree bTree = new BinaryTree();
System.out.println(bTree.isEmpty() + "--" + bTree.size());
bTree.createBinaryTree(data);
System.out.println(bTree.isEmpty() + "--" + bTree.size());
ArrayList<Integer> container = new ArrayList<Integer>();
TreeNode root = bTree.getRoot();
container.clear();
bTree.preOrderTreeWalk(root, container);
System.out.println("pre Order Binary Tree Walk: "
+ container.toString());
container.clear();
bTree.midOrderTreeWalk(root, container);
System.out.println("mid Order Binary Tree Walk: "
+ container.toString());
container.clear();
bTree.postOrderTreeWalk(root, container);
System.out.println("post Order Binary Tree Walk: "
+ container.toString());
System.out.println("Max Value: " + bTree.getMax());
System.out.println("Max Value: " + bTree.getMin());
// change the function findParentNode() to be private
// TreeNode parent = bTree.findParentNode(25);
// if (parent != null) {
// System.out.println("Parent Value: " + parent.toString());
// }
// delete a node which has no child nodes, successfully
// bTree.delete(13);
// container.clear();
// bTree.midOrderTreeWalk(root, container);
// System.out.println("mid Order Binary Tree Walk: "
// + container.toString());
// container.clear();
// bTree.postOrderTreeWalk(root, container);
// System.out.println("post Order Binary Tree Walk: "
// + container.toString());
// delete a node which has a right child node, successfully
// bTree.delete(19);
// container.clear();
// bTree.preOrderTreeWalk(root, container);
// System.out.println("pre Order Binary Tree Walk: "
// + container.toString());
// container.clear();
// bTree.midOrderTreeWalk(root, container);
// System.out.println("mid Order Binary Tree Walk: "
// + container.toString()); // delete a node which has a right child node, successfully
bTree.delete(16);
container.clear();
bTree.preOrderTreeWalk(root, container);
System.out.println("pre Order Binary Tree Walk: "
+ container.toString());
container.clear();
bTree.midOrderTreeWalk(root, container);
System.out.println("mid Order Binary Tree Walk: "
+ container.toString());
}
}

数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历的更多相关文章

  1. java操作文件的创建、删除、遍历

    java操作文件的创建.删除.遍历: package test; import java.io.File; import java.io.IOException; import java.util.A ...

  2. 二叉搜索树Java实现(查找、插入、删除、遍历)

    由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...

  3. 数据结构系列之2-3-4树的插入、查找、删除和遍历完整版源代码实现与分析(dart语言实现)

    本文属于原创,转载请注明来源. 在上一篇博文中,详细介绍了2-3树的操作(具体地址:https://www.cnblogs.com/outerspace/p/10861488.html),那么对于更多 ...

  4. 【数据结构--二叉树】Java递归实现二叉树遍历

    参考链接:https://www.cnblogs.com/yaobolove/p/6213936.html 这有一棵树: 1.节点对象 package com.tree.mybinarytree; / ...

  5. 数据结构系列之2-3树的插入、查找、删除和遍历完整版代码实现(dart语言实现)

    弄懂了二叉树以后,再来看2-3树.网上.书上看了一堆文章和讲解,大部分是概念,很少有代码实现,尤其是删除操作的代码实现.当然,因为2-3树的特性,插入和删除都是比较复杂的,因此经过思考,独创了删除时分 ...

  6. java操作xm——添加、修改、删除、遍历

    package com.xml.zh; import javax.xml.parsers.*; import javax.xml.transform.Transformer; import javax ...

  7. 【数据结构】之二叉树的java实现

    转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...

  8. Java数据结构和算法(十)——二叉树

    接下来我们将会介绍另外一种数据结构——树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

  9. 【数据结构】之二叉树(Java语言描述)

    有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...

随机推荐

  1. ZOJ-3652-Maze(BFS)

    Celica is a brave person and believer of a God in the bright side. He always fights against the mons ...

  2. &quot;CoolReaper&quot; --酷派手机后门

    文章转自:http://drops.wooyun.org/tips/4342 注:译文未获得平底锅授权,纯属学习性质翻译 原文:https://www.paloaltonetworks.com/con ...

  3. Andriod Studio科普文章——3.大约gradle常见问题插头

    1.andriod gradle插件版本号过低. 错误位置: dependencies{ classpath 'com.android.tools.build:gradle:0.10.2' } 提示信 ...

  4. NYNU_省赛选拔题(3)

    题目描述 二叉树,若其与自己的镜像完全相同,就称其为镜像树. 是一棵镜像树:而 不是镜像树.现给你一棵二叉树,请你判断其是不是镜像树. 输入 第一行是一个整数数T,表示测试数据有多少组每组数据第一行是 ...

  5. bigdata_一篇文看懂Hadoop

    本文转载:暂未找到原出处,如需署名 请联系 我们很荣幸能够见证Hadoop十年从无到有,再到称王.感动于技术的日新月异时,希望通过这篇内容深入解读Hadoop的昨天.今天和明天,憧憬下一个十年. 本文 ...

  6. hive 的分隔符、orderby sort by distribute by的优化

    一.Hive 分号字符 分号是SQL语句结束标记,在HiveQL中也是,可是在HiveQL中,对分号的识别没有那么智慧,比如: select concat(cookie_id,concat(';',' ...

  7. 从Access创建Sqlite数据库

    首先,我们需要使用SQLite Expert Professional 工具 1.创建一个新的数据库 2.由SQLite Expert创建数据库.然后import --〉Data Transfer W ...

  8. 动态类(Dynamic)应用

    动态类(Dynamic)应用 背景: 在Coding中有时候会遇到一些需要解析的数据,可是数据的字段数量和名称未统一,我们没法定义实体类来对应.那么我们就会想到通过C#的dynamic动态类来实现,如 ...

  9. Php设计模式(三):行为型模式part2

    原文详见:http://www.ucai.cn/blogdetail/7023?mid=1&f=5 可以在线运行查看效果哦! <接上文> 5.中介者模式(Mediator) : 用 ...

  10. UIButton UIImage 用法分析

    一.UIButton和UIImageView的区别 1.显示图片 1> UIImageView只能显示一种图片(图片默认会填充整个UIImageView) image\setImage: 2&g ...