<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    waysun一路陽光

    不輕易服輸,不輕言放棄.--心是夢的舞臺,心有多大,舞臺有多大。踏踏實實做事,認認真真做人。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      167 隨筆 :: 1 文章 :: 64 評論 :: 0 Trackbacks
    轉自:http://m.tkk7.com/javacap/archive/2007/10/11/152073.html
    /**
     * 
     
    */

    import java.util.Stack;
    import java.util.Vector;

    /**
     * 
    @author yovn
     *
     
    */
    public class TreeDemo {
        
        
    static interface NodeVistor
        {
             
    <T> void visit(BinaryTreeNode<T> node);
        }
        
    static class BinaryTree<T>
        {
            BinaryTreeNode
    <T> root;
            
            
    public BinaryTree(BinaryTreeNode<T> root) {
                
    this.root=root;
            }

            
    //no recursion ,pre-order
            void NLRVisit(NodeVistor visitor)
            {
                BinaryTreeNode
    <T> pointer=root;
                Stack
    <BinaryTreeNode<T>> stack=new Stack<BinaryTreeNode<T>>();
                
    while(!stack.isEmpty()||pointer!=null)
                {
                    
    if(pointer!=null)
                    {
                        visitor.visit(pointer);
                        
    if(pointer.rightChild!=null)
                        {
                            stack.push(pointer.rightChild);
                        }
                        pointer
    =pointer.leftChild;
                    }
                    
    //go to right child
                    else
                    {
                        pointer
    =stack.pop();
                        
                    }
                }
            }
            
            
    //no recursion , in-order
            void LNRVisit(NodeVistor visitor)
            {
                BinaryTreeNode
    <T> pointer=root;
                Stack
    <BinaryTreeNode<T>> stack=new Stack<BinaryTreeNode<T>>();
                
    while(!stack.isEmpty()||pointer!=null)
                {
                    
    if(pointer!=null)
                    {
                        stack.push(pointer);
                        
                        pointer
    =pointer.leftChild;
                    }
                    
    //no left child here, then visit root and then go to right child
                    else
                    {
                        pointer
    =stack.pop();
                        visitor.visit(pointer);
                        pointer
    =pointer.rightChild;
                        
                    }
                }
            }
            
            
            
    //no recursion ,post-order,this one is the most complex one.
            
    //we need know from which side ,it back(left or right)
            void LRNVisit(NodeVistor visitor)
            {
                
    if(root==null)return;
                BinaryTreeNode
    <T> pointer=root;
                Stack
    <BinaryTreeNode<T>> stack=new Stack<BinaryTreeNode<T>>();
                
    while(true)
                {
                    
                    
    //mark left 
                    while(pointer!=null)
                    {
                        stack.push(pointer);
                        pointer
    =pointer.leftChild;
                    }
                    
                    
                    pointer
    =stack.pop();
                    
                    
    while(pointer.visitedRight)//back from right child, so we can visit it now.
                    {
                        visitor.visit(pointer);
                        
    if(stack.isEmpty())return;
                        pointer
    =stack.pop();
                    }
                
                    pointer.visitedRight
    =true;
                    stack.push(pointer);
                    
                    pointer
    =pointer.rightChild;
                    
                    
                }
                
            }
            
            
            
    void levelOrder(NodeVistor visitor)
            {
                
    if(root==null)return;
                BinaryTreeNode
    <T> pointer=root;
                Vector
    <BinaryTreeNode<T>> queue=new Vector<BinaryTreeNode<T>>();
                
                queue.add(pointer);
                
    while(!queue.isEmpty())
                {
                    BinaryTreeNode
    <T> node=queue.remove(0);
                    visitor.visit(node);
                    
    if(node.leftChild!=null)
                    {
                        queue.add(node.leftChild);
                    }
                    
    if(node.rightChild!=null)
                    {
                        queue.add(node.rightChild);
                    }
                    
                }
                
            }
            
        }
        
    static class BinaryTreeNode<T>
        {
            
            BinaryTreeNode(T data)
            {
                
    this.data=data;
            }
            T data;
            
    boolean visitedRight;
            BinaryTreeNode
    <T> leftChild;
            BinaryTreeNode
    <T> rightChild;
        }

        
    /**
         * 
         
    */
        
    public TreeDemo() {
            
    // TODO Auto-generated constructor stub
        }

        
    /**
         * 
    @param args
         
    */
        
    public static void main(String[] args) {
            BinaryTreeNode
    <String> root=new BinaryTreeNode<String>("A");
            root.leftChild
    =new BinaryTreeNode<String>("B");
            root.rightChild
    =new BinaryTreeNode<String>("C");
            
            
            root.leftChild.leftChild
    =new BinaryTreeNode<String>("D");
            
            root.rightChild.leftChild
    =new BinaryTreeNode<String>("E");
            
            root.rightChild.rightChild
    =new BinaryTreeNode<String>("F");
            
            root.rightChild.leftChild.rightChild
    =new BinaryTreeNode<String>("G");
            
            root.rightChild.rightChild.leftChild
    =new BinaryTreeNode<String>("H");
            root.rightChild.rightChild.rightChild
    =new BinaryTreeNode<String>("I");
            
            NodeVistor visitor
    =new NodeVistor()
            {

                @Override
                
    public <T> void visit(BinaryTreeNode<T> node) {
                    System.out.print(
    "'"+node.data+"'");
                    
                }
                
            };
            
            BinaryTree
    <String> tree=new BinaryTree<String>(root);

            
            System.out.println(
    "pre-order visit");
            tree.NLRVisit(visitor);
            System.out.println();
            System.out.println(
    "in-order visit");
            
            tree.LNRVisit(visitor);
            
            System.out.println();
            System.out.println(
    "post-order visit");
            
            tree.LRNVisit(visitor);
            
            System.out.println();
            System.out.println(
    "level-order visit");
            
            tree.levelOrder(visitor);
        }

    }

    posted on 2009-04-15 22:03 weesun一米陽光 閱讀(272) 評論(0)  編輯  收藏 所屬分類: JAVA源碼總結備用
    主站蜘蛛池模板: 国产精品国产自线拍免费软件| 国产AV无码专区亚洲AWWW| 亚洲午夜久久久久久久久久| 美女露100%胸无遮挡免费观看| 在线精品免费视频| 亚洲日韩国产二区无码 | 精品久久久久久亚洲| 一个人晚上在线观看的免费视频| 无码国模国产在线观看免费| 国产精品成人亚洲| 中文字幕在亚洲第一在线| 中国一级全黄的免费观看| 亚洲成A人片777777| 99久久99久久免费精品小说| 亚洲卡一卡2卡三卡4麻豆| 亚洲欧洲免费无码| 免费一级毛suv好看的国产网站| 亚洲视频在线一区二区| a成人毛片免费观看| 亚洲男人的天堂在线| 毛片a级毛片免费观看免下载| 美女视频黄频a免费大全视频| 国产精品亚洲αv天堂无码| 曰批全过程免费视频在线观看无码| 亚洲国产成人精品无码区在线观看 | 亚洲AV无码一区二区大桥未久| 七次郎成人免费线路视频| 日本亚洲视频在线| 国产免费女女脚奴视频网| 国产偷国产偷亚洲高清在线| 亚洲日产韩国一二三四区| 国产电影午夜成年免费视频| 美女被免费视频网站a| 亚洲午夜久久久久久久久电影网| 狼群影院在线观看免费观看直播 | 亚洲成a人片在线观看播放| 在线免费观看国产视频| a毛片免费全部在线播放**| 亚洲区日韩精品中文字幕| 亚洲区小说区激情区图片区| 免费精品人在线二线三线区别|