package edu.hue.jk.tree;
import java.util.Stack;
class Person implements Comparable<Person>{
int age;
String name;
@Override
public int compareTo(Person o) {
if(this.age>o.age)
return 1;
return 0;
}
Person(){}
Person(int age,String name){
this.age=age;
this.name=name;
}
@Override
public String toString() {
return "age:"+this.age+" name:"+this.name;
}
}
//定義數的結構
class MyTree<T>{
T data;
MyTree<T> lchild; //左子樹
MyTree<T> rchild; //右子樹
MyTree(T data){
this.data=data;
this.lchild=null;
this.rchild=null;
}
//插入結點,建立二叉排序樹
void insertNode(T node){
MyTree<T> currentNode=this;
MyTree<T> parentNode=this;
while(currentNode!=null){
parentNode=currentNode;
if(node.getClass()==Integer.class){
if((Integer)(currentNode.data)>(Integer)node){
currentNode=currentNode.lchild;
}
else{
currentNode=currentNode.rchild;
}
}
if(node.getClass()==Float.class){
if((Float)(currentNode.data)>(Float)node){
currentNode=currentNode.lchild;
}
else{
currentNode=currentNode.rchild;
}
}
if(node.getClass()==Person.class){
if((((Person)currentNode.data).compareTo((Person)node))>0){
currentNode=currentNode.lchild;
}
else{
currentNode=currentNode.rchild;
}
}
}
if(node.getClass()==Integer.class){
MyTree<T> newNode=new MyTree<T>(node);
if((Integer)(parentNode.data)>(Integer)node){
parentNode.lchild=newNode;
}
else{
parentNode.rchild=newNode;
}
}
if(node.getClass()==Float.class){
MyTree<T> newNode=new MyTree<T>(node);
if((Float)(parentNode.data)>(Float)node){
parentNode.lchild=newNode;
}
else{
parentNode.rchild=newNode;
}
}
if(node.getClass()==Person.class){
MyTree<T> newNode=new MyTree<T>(node);
if((((Person)(parentNode.data)).compareTo((Person)node))>0){
parentNode.lchild=newNode;
}
else{
parentNode.rchild=newNode;
}
}
}
// 先序遍歷二叉樹
void preSearch(MyTree<T> pp){
if(pp!=null){
System.out.print(pp.data+" ");
preSearch(pp.lchild);
preSearch(pp.rchild);
}
}
//先序遍歷非遞歸寫法
void preSearchf(MyTree<T> pp){
Stack<MyTree<T>> stack=new Stack<MyTree<T>>(); //定義一個棧
MyTree<T> p=pp;
while(!(p==null && stack.empty())){ //當且僅當當前結點爲空且隊列爲空時,遍歷完成
if(p!=null){
System.out.print(p.data+" ");
if(p.rchild!=null)
stack.add(p); //如果右結點不爲空就入棧
p=p.lchild; //遍歷左子樹
}
else{
p=stack.lastElement().rchild; //取棧頂元素的又子樹
stack.pop(); //出棧
}
}
}
//中序遞歸遍歷二叉樹
void orderSearch(MyTree<T> pp){
if(pp!=null){
orderSearch(pp.lchild);
System.out.print(pp.data+" ");
orderSearch(pp.rchild);
}
}
//中序非遞歸遍歷二叉樹
void orderSearchf(MyTree<T> pp){
Stack<MyTree<T>> stack=new Stack<MyTree<T>>();
MyTree<T> p=pp;
while(!(p==null && stack.empty())){
if(p!=null){
stack.add(p);
p=p.lchild;
}
else{
p=stack.lastElement();
stack.pop();
System.out.print(p.data+" ");
p=p.rchild;
}
}
}
//後序遞歸遍歷二叉樹
void postSearch(MyTree<T> p){
if(p!=null){
postSearch(p.lchild);
postSearch(p.rchild);
System.out.print(p.data+" ");
}
}
//後序非遞歸遍歷二叉樹
void postSearchf(){
MyTree<T> p=this;
MyTree<T> pre=null;
Stack<MyTree<T>> stack=new Stack<MyTree<T>>();
while(!(stack.empty()&&p==null)){
if(p!=null){
stack.push(p);
p=p.lchild;
}
else{
p=stack.lastElement(); //取棧頂元素,先不出棧
if(p.rchild!=null && p.rchild!=pre){
pre=p;
p=p.rchild;
}
else{
System.out.print(p.data+" ");
stack.pop(); //訪問根元素之後再出棧
pre=p;
p=null;
}
}
}
}
};
public class TheTree {
public static void main(String[] args) {
MyTree<Integer> int_tree=new MyTree<Integer>(70);
int_tree.insertNode(60);
int_tree.insertNode(80);
int_tree.insertNode(55);
int_tree.insertNode(65);
int_tree.insertNode(78);
System.out.println("*******************先序遍歷結果:************");
int_tree.preSearch(int_tree);
System.out.println();
int_tree.preSearchf(int_tree);
System.out.println();
System.out.println("*******************先序遍歷結束:************");
System.out.println();
System.out.println("*******************中序遍歷結果:************");
System.out.println();
int_tree.orderSearch(int_tree);
System.out.println();
int_tree.orderSearchf(int_tree);
System.out.println();
System.out.println("*******************後序遍歷結束:************");
System.out.println();
int_tree.postSearch(int_tree);
System.out.println();
int_tree.postSearchf();
System.out.println();
System.out.println("*******************後序遍歷結束:************");
MyTree<Float> float_tree=new MyTree<Float>(70.0f);
float_tree.insertNode(60.0f);
float_tree.insertNode(80.0f);
float_tree.insertNode(50.0f);
float_tree.insertNode(48.0f);
float_tree.insertNode(35.0f);
float_tree.insertNode(49.0f);
float_tree.insertNode(75.0f);
System.out.println("*******************先序遍歷結果:************");
float_tree.preSearch(float_tree);
System.out.println();
float_tree.preSearchf(float_tree);
System.out.println();
System.out.println("*******************先序遍歷結束:************");
System.out.println();
System.out.println("*******************中序遍歷結果:************");
System.out.println();
float_tree.orderSearch(float_tree);
System.out.println();
float_tree.orderSearchf(float_tree);
System.out.println();
System.out.println("*******************後序遍歷結束:************");
System.out.println();
float_tree.postSearch(float_tree);
System.out.println();
float_tree.postSearchf();
System.out.println();
System.out.println("*******************後序遍歷結束:************");
MyTree<Person>person_tree=new MyTree<Person>(new Person(70,"123"));
person_tree.insertNode(new Person(60,"456"));
person_tree.insertNode(new Person(50,"456"));
System.out.println("*******************先序遍歷結果:************");
person_tree.preSearch(person_tree);
System.out.println();
person_tree.preSearchf(person_tree);
System.out.println();
System.out.println("*******************先序遍歷結束:************");
System.out.println();
System.out.println("*******************中序遍歷結果:************");
System.out.println();
person_tree.orderSearch(person_tree);
System.out.println();
person_tree.orderSearchf(person_tree);
System.out.println();
System.out.println("*******************後序遍歷結束:************");
System.out.println();
person_tree.postSearch(person_tree);
System.out.println();
person_tree.postSearchf();
System.out.println();
System.out.println("*******************後序遍歷結束:************");
}
}
java實現樹的前序,中序,後序的遞歸和非遞歸遍歷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.