您的位置:首页 > 理论基础 > 数据结构算法

java数据结构之实现 二叉树 以及二叉树的遍历方式(三)

2017-08-28 09:55 681 查看
网上关于二叉树的实现以及操作有很多,自己花时间仔细瞧了一遍 理解了下具体的原理  

二叉树的实现 ,具体看注释  可以评论交流或者发邮件

import java.util.*;
import java.util.Stack;

/**
* Created by gy on 2017/8/23.
* email : guoyang000111@163.com
* 二叉树的遍历
*/
public class LinkBTreeOrder {
private java.util.Stack  stack=new java.util.Stack ();
/**
* 前序遍历
* @param btree
*/
public void preOrder(Btree btree){
if(btree!=null){
System.out.println(btree.getRootData());
if(btree.getLeftChild()!=null){
preOrder(btree.getLeftChild());
}
if(btree.getRightChild()!=null){
preOrder(btree.getRightChild());
}
}
}

/**
* 中序遍历
* @param btree
*/
public void inOrder(Btree btree){
if(btree!=null){
if(btree.getLeftChild()!=null){
inOrder(btree.getLeftChild());
}
System.out.println(btree.getRootData());
if(btree.getRightChild()!=null){
inOrder(btree.getRightChild());
}
}
}

/**
* 后序遍历
* @param btree
*/
public void postOrder(Btree btree){
if(btree!=null){
if(btree.getLeftChild()!=null){
postOrder(btree.getLeftChild());
}
if(btree.getRightChild()!=null){
postOrder(btree.getRightChild());
}
System.out.println(btree.getRootData());
}
}

/**
* 使用非递归法 实现中序遍历
* @param btree
*/
public void noRecursionOrder(Btree btree){
stack.clear();
stack.push(btree);
Btree bt;
while(!stack.isEmpty()) {
//左孩子结点进栈
while((bt = ((Btree)(stack.peek())).getLeftChild()) != null) {
stack.push(bt);
}
//如果该结点没有右孩子,则逐级往上出栈
while(!stack.isEmpty() &&!( (Btree)stack.peek()).hasRightTree()) {
bt = (Btree)stack.pop();
System.out.println(bt.getRootData());
}
//如果该结点有右孩子,则右孩子进栈
if(!stack.isEmpty() && ( (Btree)stack.peek() ).hasRightTree()){
bt = (Btree)stack.pop();
System.out.println(bt.getRootData());
stack.push(bt.getRightChild());
}
}

}

/**
* 使用非递归法 实现前序排列
* @param btree
*/
public void noRecursionPreOrder(Btree btree){
stack.clear();
stack.push(btree);
Btree bt;
while(!stack.isEmpty()) {
//左孩子结点进栈
while((bt = ((Btree)(stack.peek())).getLeftChild()) != null) {
//没有右结点  输出结点   并且有左结点 入栈
while(!stack.isEmpty() &&!( (Btree)stack.peek()).hasRightTree()) {
bt = (Btree)stack.pop();
System.out.println(bt.getRootData());
if(bt.hasLeftTree()){
stack.push(bt.getLeftChild());
}
}
//有右结点  输出结点   同时右节点入栈 左结点入栈
if(!stack.isEmpty() && ( (Btree)stack.peek() ).hasRightTree()){
bt = (Btree)stack.pop();
System.out.println(bt.getRootData());
stack.push(bt.getRightChild());
stack.push(bt.getLeftChild());
}
if(stack.isEmpty()){
break;
}
}

}
}
Btree node;
int num=0;

/**
* 求二叉树的最大值 int型
* @param root
* @return
*/
public Btree maxNode(Btree root) {
// write your code here
if(root!=null){
if((int)root.getRootData()>num){
node=root;
num=(int)root.getRootData();

}
if(root.hasLeftTree()||root.hasRightTree()){
if(root.hasLeftTree()){
if((int)root.getLeftChild().getRootData()>num){
node=root.getLeftChild();
num=(int)root.getLeftChild().getRootData();
}
maxNode(root.getLeftChild());
}
if(root.hasRightTree()){
if((int)root.getRightChild().getRootData()>num){
node=root.getRightChild();
num=(int)root.getRightChild().getRootData();
}
maxNode(root.getRightChild());
}
}else{
return node;
}
}
return node;
}

public static void main(String[] args) {
Btree root =new LinkBtree(1);
Btree bt1, bt2, bt3, bt4,bt5,bt6,bt7,bt8,bt9;
bt1=new LinkBtree(-5);
root.addLeftTree(bt1);
bt2=new LinkBtree(0);
bt1.addLeftTree(bt2);
bt3=new LinkBtree(2);
root.addRightTree(bt3);
bt4=new LinkBtree(3);
bt1.addRightTree(bt4);
bt5=new LinkBtree(-4);
bt3.addLeftTree(bt5);
bt6=new LinkBtree(-5);
bt3.addRightTree(bt6);
bt7=new LinkBtree(10);
bt5.addLeftTree(bt7);
//        bt8=new LinkBtree("**");
//        bt2.addRightTree(bt7);
//        bt6.addLeftTree(bt8);
//        bt9=new LinkBtree("666");
//        bt8.addLeftTree(bt9);

System.out.println("节点数:"+root.size());
System.out.println("深度:"+root.dept());

LinkBTreeOrder order =new LinkBTreeOrder();
//        order.inOrder(root);
//        order.noRecursionOrder(root);
//        order.preOrder(root);
//        order.noRecursionPreOrder(root);
//        order.inOrder(root);
//        order.postOrder(root);
Btree root1=order.maxNode(root);
System.out.println(root1.getRootData());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: