zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    通讯录封装实现
    简单通讯录的实现 main..h .m文件全部
    iOS 开发 OC编程 字典和集合 排序方法
    iOS 开发 OC编程 数组冒泡排序.图书管理
    iOS 开发 OC编程 属性和字符串练习
    iOS 开发 OC编程 属性和字符串
    iOS 开发 OC编程 便利构造器以及初始化方法
    iOS 开发 OC编程 方法的书写
    IOS 开发 OC编程 类和对象
    iOS 开发 c语言阶段考试题
  • 原文地址:https://www.cnblogs.com/jayceli/p/2428613.html
Copyright © 2011-2022 走看看