网上关于二叉树的实现以及操作有很多,自己花时间仔细瞧了一遍 理解了下具体的原理
二叉树的实现 ,具体看注释 可以评论交流或者发邮件
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());
}
}