根据自己的学习体会并参考了一些网上的资料,以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. 创建线程的两种方式:继承Thread类和实现Runnable接口

    第一种方式:继承Thread类 步骤:1.定义类继承Thread 2.覆写Threa类的run方法. 自定义代码放在run方法中,让线程运行 3.调用线程的star方法, 该线程有两个作用:启动线程, ...

  2. Android IPC通信和AIDL技术应用

    首先我们了解一下 IPC和AIDL IPC:进程间通信 AIDL:Android Interface Definition Language,即Android接口定义语言. 为什么使用: Androi ...

  3. Is it always safe to call getClass() within the subclass constructor?(转)

    14down votefavorite   An article on classloading states that the method getClass() should not be cal ...

  4. Oracle语句优化1

    Oracle语句优化1 优化就是选择最有效的方法来执行SQL语句.Oracle优化器选择它认为最有效的     方法来执行SQL语句.         1. IS   NULL和IS   NOT   ...

  5. SSH框架总结(帧分析+环境结构+示例源代码下载)

    首先,SSH不是一个框架.而是多个框架(struts+spring+hibernate)的集成,是眼下较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  6. crmplugin项目加入key文件

    通常,办crm的plugin发展,然后dll文件导入系统,都需要加入项目key文件,那么怎么办? 在右上角单击指定项目--属性: 点击属性后,弹出属性编辑框: watermark/2/text/aHR ...

  7. Android Fragment 真正彻底的解决(下一个)

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因.以及一些主要的使用方 ...

  8. Controller与Action

    Controller与Action 我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本 ...

  9. Git批量删除

    Git批量删除 git的改动都需要stage过程后才能commit.当git中有大量改动时就需要能够批量操作在方便.改动分三种: modify: 有文件修改 add: 有文件增加 rm: 有文件删除 ...

  10. codeigniter 操作mysql的PHP代码--更新

    支持标准前缀 1)查询没有平等,有平等的 $this->db->get_where('host',array('host'=>'ddd','id !='=>0))->ro ...