Java-数据结构之二叉树练习
本来这个随笔应该在4月17号就应该发出来的。不巧的是,那天晚上收到了offer,然后接下去两天为入职到处跑,20号入职后一直忙,直到最近几天才有时间看看书。然而20多天前就看完的了二叉树,然后17号那天正在按照二叉树的定义自己写一个完整的二叉树。本来那天晚上就能完成的,这么一个打断,导致现在想接上去之前的思路继续写二叉树有点难了。所以二叉树里面的删除部分以及Iterator部分直接是看着书写的......
下面是MyBinaryTree.java
//MyBinaryTree.java
package struct; import java.util.ArrayList;
import java.util.Iterator; public class MyBinaryTree<E extends Comparable<E>>
{
private TreeNode<E> root;
private int treeSize=0; public MyBinaryTree()
{} public MyBinaryTree(E[] o)
{
for(int i=0;i<o.length;i++)
{
insert(o[i]);
}
} private class TreeNode<E extends Comparable<E>>
{
public E element;
public TreeNode<E> leftChild;
public TreeNode<E> rightChild; public TreeNode()
{} public TreeNode(E o)
{
this.element = o;
}
} //寻找一个元素
public boolean search(E o)
{
TreeNode<E> current; if(root == null)
return false;
else
{
current=root; while(true)
{
if(current.element.compareTo(o) == 0) //相等
{
return true;
}
else if(current.element.compareTo(o) > 0) //current.element大
{
if(current.leftChild!=null) current = current.leftChild;
else
return false;
}
else if(current.element.compareTo(o) < 0) //o大
{
if(current.rightChild!=null) current = current.rightChild;
else
return false;
}
else
return false;
}
}
} //插入一个元素
public boolean insert(E o)
{
TreeNode<E> current; if(root==null)
{
root = new TreeNode<E>(o);
treeSize++;
return true;
}
else
{
current=root; while(true)
{
if(current.element.compareTo(o) > 0) //current.element大
{
if(current.leftChild!=null) current = current.leftChild;
else
{
current.leftChild = new TreeNode<E>(o);
treeSize++;
return true;
}
}
else if(current.element.compareTo(o) < 0) //o大
{
if(current.rightChild!=null) current = current.rightChild;
else
{
current.rightChild = new TreeNode<E>(o);
treeSize++;
return true;
}
}
else
{
return false;
}
}
}
} //删除一个元素
public boolean delete(E o)
{
TreeNode<E> current=root;
TreeNode<E> parent=null; //current==root==null返回false
if(current==null)
return false;
//寻找一个相等的元素
while(current.element.compareTo(o)!=0)
{
if(current.element.compareTo(o) > 0)
{
if(current.leftChild == null)
return false;
else
{
parent = current;
current = current.leftChild;
}
}
else
{
if(current.rightChild == null)
return false;
else
{
parent = current;
current = current.rightChild;
}
}
} //找到一个相等的元素之后,左右子树均为空
if(current.leftChild==null && current.rightChild==null)
{
current = null;
treeSize--;
return true;
}
else if(current.leftChild==null)//左子树为空
{
if(parent==null)
root=current.rightChild;
else
{
if(parent.element.compareTo(o)>0)
parent.leftChild=current.rightChild;
else
parent.rightChild=current.rightChild;
}
treeSize--;
return true;
}
else
{
//右子树为空,或者左右子树均不为空
TreeNode<E> parentOfBiggest = current;
TreeNode<E> theBiggest = current.leftChild; while(theBiggest.rightChild!=null)
{
parentOfBiggest=theBiggest;
theBiggest = theBiggest.rightChild;
} current.element = theBiggest.element; if(parentOfBiggest.rightChild == theBiggest)
parentOfBiggest.rightChild = theBiggest.leftChild;
else
parentOfBiggest.leftChild = theBiggest.leftChild; treeSize--;
return true;
}
} //中序
public void inorder()
{
TreeNode<E> current;
current = root;
if(current!=null)
{
inorder(current.leftChild);
System.out.print(current.element+" ");
inorder(current.rightChild);
System.out.println();
}
} private void inorder(TreeNode<E> current)
{
if(current!=null)
{
inorder(current.leftChild);
System.out.print(current.element+" ");
inorder(current.rightChild);
}
} //前序
public void preorder()
{
TreeNode<E> current;
current = root;
if(current!=null)
{
System.out.print(current.element+" ");
preorder(current.leftChild);
preorder(current.rightChild);
System.out.println();
}
} private void preorder(TreeNode<E> current)
{
if(current!=null)
{
System.out.print(current.element+" ");
preorder(current.leftChild);
preorder(current.rightChild);
}
} //后序
public void postorder()
{
TreeNode<E> current;
current = root;
if(current!=null)
{
postorder(current.leftChild);
postorder(current.rightChild);
System.out.print(current.element+" ");
System.out.println();
}
} private void postorder(TreeNode<E> current)
{
if(current!=null)
{
postorder(current.leftChild);
postorder(current.rightChild);
System.out.print(current.element+" ");
}
} //get树的大小
public int getSize()
{
return treeSize;
} //是否为空
public boolean isEmpty()
{
return treeSize==0;
} //iterator
public Iterator iterator()
{
return inorderIterator();
} //清空
public void clear()
{
root=null;
treeSize=0;
} public Iterator inorderIterator()
{
return new InorderIterator();
} class InorderIterator implements Iterator
{
private ArrayList<E> list = new ArrayList<E>();
private int current = 0; public InorderIterator()
{
inorder();
} private void inorder()
{
inorder(root);
} private void inorder(TreeNode<E> root)
{
if(null == root)
return;
inorder(root.leftChild);
list.add(root.element);
inorder(root.rightChild);
} @Override
public boolean hasNext()
{
if(current < list.size())
return true; return false;
} @Override
public Object next()
{
return list.get(current++);
} public void remove()
{
delete(list.get(current));
list.clear();
inorder();
}
}
}
下面是MyBinaryTreeTest.java
//MyBinaryTreeTest.java
package struct; public class MyBinaryTreeTest
{
public static void main(String[] args)
{
MyBinaryTree<Integer> mbt = new MyBinaryTree<Integer>();
mbt.insert(12);
mbt.insert(34);
mbt.insert(6);
mbt.insert(24);
mbt.insert(4);
mbt.insert(346);
mbt.insert(40);
mbt.insert(346); System.out.println("mbt size: "+mbt.getSize()); if(!mbt.search(346))
System.out.println("did not contains!");
else
System.out.println("have this number!"); System.out.print("mbt inorder: ");
mbt.inorder();
System.out.print("mbt preorder: ");
mbt.preorder();
System.out.print("mbt postorder: ");
mbt.postorder(); Integer[] a = new Integer[]{56,26,24,89,1,100,7,55,43,1};
MyBinaryTree<Integer> mbt2 = new MyBinaryTree<Integer>(a); System.out.print("mbt2 inorder: ");
mbt2.inorder();
System.out.print("mbt2 preorder: ");
mbt2.preorder();
System.out.print("mbt2 postorder: ");
mbt2.postorder(); System.out.println("mbt2 size: "+mbt2.getSize());
mbt2.clear();
System.out.println("mbt2 size: "+mbt2.getSize()); if(!mbt2.search(1))
System.out.println("did not contains!");
else
System.out.println("have this number!"); MyBinaryTree<Integer> mbt3 = new MyBinaryTree<Integer>(a);
System.out.print("mbt3 inorder: ");
mbt3.inorder();
System.out.print("mbt3 preorder: ");
mbt3.preorder();
System.out.print("mbt3 postorder: ");
mbt3.postorder(); System.out.println("before delete size:"+mbt3.getSize());
System.out.println(mbt3.delete(26));
System.out.println("after delete size:"+mbt3.getSize());
System.out.print("mbt3 inorder: ");
mbt3.inorder();
System.out.print("mbt3 preorder: ");
mbt3.preorder();
System.out.print("mbt3 postorder: ");
mbt3.postorder(); System.out.println("before delete size:"+mbt3.getSize());
System.out.println(mbt3.delete(1888));
System.out.println("after delete size:"+mbt3.getSize());
}
}
最后是运行结果
//result
mbt size: 7
have this number!
mbt inorder: 4 6 12 24 34 40 346
mbt preorder: 12 6 4 34 24 346 40
mbt postorder: 4 6 24 40 346 34 12
mbt2 inorder: 1 7 24 26 43 55 56 89 100
mbt2 preorder: 56 26 24 1 7 55 43 89 100
mbt2 postorder: 7 1 24 43 55 26 100 89 56
mbt2 size: 9
mbt2 size: 0
did not contains!
mbt3 inorder: 1 7 24 26 43 55 56 89 100
mbt3 preorder: 56 26 24 1 7 55 43 89 100
mbt3 postorder: 7 1 24 43 55 26 100 89 56
before delete size:9
true
after delete size:8
mbt3 inorder: 1 7 24 43 55 56 89 100
mbt3 preorder: 56 24 1 7 55 43 89 100
mbt3 postorder: 7 1 43 55 24 100 89 56
before delete size:8
false
after delete size:8
Java-数据结构之二叉树练习的更多相关文章
- java数据结构之二叉树的实现
java二叉树的简单实现,可以简单实现深度为n的二叉树的建立,二叉树的前序遍历,中序遍历,后序遍历输出. /** *数据结构之树的实现 *2016/4/29 * **/ package cn.Link ...
- Java数据结构之二叉树的基本介绍与递归遍历
二叉树的基本概念: 正如我们所了解的,树是有很多中形态,但是我们规定,形如每个节点最多只能有两个子节点的一种形如称为二叉树.我们将二叉树中该节点的两个子节点分别称作为:左孩子节点和右孩子节点.该节点称 ...
- JAVA数据结构之二叉树
用树作为存储数据的结构兼具像数组一样查询速度快和像链表一样具有很快的插入和删除数据项的优点 我们用圆点表示节点,连接圆的直线表示边如下图所示就表示了一颗树,接下来我们讨论的二叉树即每个节点最多只有两个 ...
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
- java数据结构之二叉树的定义和递归实现
定义最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树.递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称为左 ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构和算法 - 二叉树
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...
- Java数据结构和算法(六)--二叉树
什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...
- 【java 数据结构】还不会二叉树?一篇搞定二叉树
二叉树是我们常见的数据结构之一,在学习二叉树之前我们需要知道什么是树,什么是二叉树,本篇主要讲述了二叉树,以及二叉树的遍历. 你能get到的知识点? 1.树的介绍 2.二叉树的介绍 3.二叉树遍历的四 ...
随机推荐
- 类型信息(RTTI和反射)——RTTI
运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就先来说下RTTI. 1.RTTI: RTTI:在运行时,识别一个 ...
- 【转载】SQL执行计划
要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. ...
- CentOS6下DHCP服务(二)简单配置案例及故障排查
1.预分配网络参数如下:linux服务器:eth0 IP为192.168.8.250 做为局域网DHCP服务器局域网网段设置为192.168.8.0/24:内部计算机的router为192.168. ...
- HTML5开发,背后的事情你知道吗?
现在的H5越来越受到企业或者是开发者的一个大力的追捧,已经成为网络推广必不可少的一个使用的工具,相信还有很多朋友现在都不知道H5是个什么东西,本文将为大家讲的是关于H5一些分类的问题,让你进一步的去学 ...
- 【js基础修炼之路】- 手把手教你实现bind
手写bind前我们先回顾一下bind有哪些特性,以便更好的理解bind和实现bind. bind的特性 var obj = { a: 100, say(one, two) { console.log( ...
- SQL-有关数据库的提问
各位大侠,小弟初来乍到,对sql , pl/sql ,t/sql概念比较模糊,有以下几个问题希望能帮我解答: 1:plsql到底是语言还是工具?我看到有人说oracle的存储过程是拿plsql写的,那 ...
- C++学习之虚函数继承和虚继承
虚函数的定义要遵循以下重要规则: 1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行晚绑定的. 2.只有类的成员函 ...
- SPOJ - LIS2 Another Longest Increasing Subsequence Problem
cdq分治,dp(i)表示以i为结尾的最长LIS,那么dp的递推是依赖于左边的. 因此在分治的时候需要利用左边的子问题来递推右边. (345ms? 区间树TLE /****************** ...
- 20145238-荆玉茗《Java程序设计》课程总结
每周读书笔记链接汇总 第一周读书笔记: 第二周读书笔记: 第三周读书笔记: 第四周读书笔记: 第五周读书笔记: 第六周读书笔记: 第七周读书笔记: 第八周读书笔记: 第九周读书笔记: 实验报告链接汇总 ...
- Vuex基础-Action
在文章开始之前,再次强调一句:Vuex会把getter mutations action不管是在模块定义的还是在根级别定义的 都会注册在全局 官网API地址:https://vuex.vuejs.or ...