• Binary tree traverse


    package com.exuan.btreetraverse;

    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Stack;

    public class BTreeTraverse {
        
        public static void main(String[] args)
        {
            
        }
        
    /*-------------------------------------------------------------
     * traverse the binary tree without using the recursion method
     * start
     */
        
        /* -----------------------------------------------------
         * start 'depth-first' traverse
         * we need to use a stack in the 'depth-first' traverse
         */
        
        //pre-order traverse
        private static void preOrderTraverse(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            while(node != null || !s.empty())
            {
                while(node != null)
                {
                    visit(node);//visit the root
                    s.push(node);
                    node = node.left;//visit the left child
                }
                if(!s.empty())
                {
                    node = s.pop();
                    node = node.right;//visit the right child
                }
            }
        }
        
        //in-order traverse
        private static void inOrderTraverse(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            while(node != null || !s.empty())
            {
                while(node != null)
                {
                    s.push(node);
                    node = node.left;//visit the left child
                }
                if(!s.empty())
                {
                    node = s.pop();
                    visit(node);//visit the root
                    node = node.right;//visit the right child
                }
            }
        }
        
        
        //post-order traverse
        private static void postOrderTraverse(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            /*we need a temporary variable to store the previous visited node,
             * if we have visit the left child and the right child
             * then the pre must be the right child, new we can visit the root
             * */
            TreeNode pre = null;
            while(node != null || !s.empty())
            {
                if(node != null)
                {
                    s.push(node);
                    node = node.left;//visit the left child
                }
                else
                {
                    node = s.peek();
                    if(node.right != null && pre != node.right)
                    {
                        node = node.right;//visit the right child
                    }
                    else
                    {
                        /*the node doesn't have a right child or
                         * the right child has been visited(means the pre == node.right),
                         * now we can visit it
                         */
                        node = s.peek();
                        pre = s.peek();
                        visit(node);//visit the root
                        s.pop();
                        node = null;
                    }
                }
            }
        }
        
        /* end 'depth-first' traverse
         * -----------------------------------------------------
         */
        
        /* -----------------------------------------------------
         * start 'breadth-first' traverse
         * 'breadth-first' traverse is 'level order' traverse
         * we need to use a queue in the 'depth-first' traverse
         */
        
        private static void BFTraverse(TreeNode root)
        {
            Queue q = new LinkedList();
            TreeNode node = root;
            if(node != null)
            {
                q.add(node);
                while(!q.isEmpty())
                {
                    node = q.peek();
                    visit(node);
                    if(node.left != null)
                    {
                        q.add(node.left);
                    }
                    if(node.right != null)
                    {
                        q.add(node.right);
                    }
                    q.remove();
                }
            }
        }
        
        /* end 'breadth-first' traverse
         * -----------------------------------------------------
         */
        
    /*end
    * traverse the binary tree without using the recursion method
    * -------------------------------------------------------------
    */
        
    /*-------------------------------------------------------------
    * traverse the binary tree using the recursion method
    * start
    */
        
        //pre-order traverse
        private static void preOrderTraverseR(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            visit(node);
            preOrderTraverseR(node.left);
            preOrderTraverseR(node.right);
        }
        
        //in-order traverse
        private static void inOrderTraverseR(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            preOrderTraverseR(node.left);
            visit(node);
            preOrderTraverseR(node.right);
        }
        
        
        //post-order traverse
        private static void postOrderTraverseR(TreeNode root)
        {
            Stack s = new Stack();
            TreeNode node = root;
            preOrderTraverseR(node.left);
            preOrderTraverseR(node.right);
            visit(node);
        }

    /*end
    * traverse the binary tree using the recursion method
    * -------------------------------------------------------------
    */    
        
        private static void visit(TreeNode node)
        {
            System.out.print(node.data + ",");
        }
        
    }

    class TreeNode
    {
        int data;
        TreeNode left;
        TreeNode right;
    }

  • 相关阅读:
    "无法在证书存储区中找到清单签名证书"的解决办法
    Windows消息ID说明
    ToolBar来的是什么事. (ToolBar 难见的Bug)
    SQL Tips 收集常用的SQL
    郁闷的内存泄露,增加TmfEditFormCmptMgr.OnDstMainSetFieldData惹的祸
    FormDestroy和Destroy中选其一个使用.
    一步步教你优化Delphi字串查找(转载)
    利用SQL建立数据库对象
    数据字典ChangeName引发的问题.
    测试Live Writer
  • 原文地址:https://www.cnblogs.com/jayceli/p/2428613.html
Copyright © 2020-2023  润新知