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

来源:互联网 发布:爱淘宝 1元红包 最新 编辑:程序博客网 时间:2024/06/04 07:15

网上关于二叉树的实现以及操作有很多,自己花时间仔细瞧了一遍 理解了下具体的原理  

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

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());    }}

阅读全文
0 0
原创粉丝点击