java实现二叉树的非递归遍历

研究了一上午被进栈出栈搞晕了 终于弄出来了 直接上代码 

package com.wyy.test;

import java.util.Stack;


public class TransverseTreeWithoutDGTest {
    public static void main(String[] args){
        Tree tree = new Tree();
        tree.insert("A", 30);
        tree.insert("B", 42);
        tree.insert("C", 19);
        tree.insert("D", 22);
        tree.insert("E", 33);
        tree.insert("F", 45);
        tree.insert("G", 20);
        tree.preOrder(tree.root);
        System.out.println();
        tree.midOrder(tree.root);
        System.out.println();
        tree.lastOrder(tree.root);
        System.out.println();
        System.out.println("----------------------------");
        Tree.postOrderWithStack(tree.root);
    }
}
class Node{
    public String name;
    public int count;
    public Node leftChild;
    public Node rightChild;
    public Node(String name,int count){
        this.name = name;
        this.count = count;
    }
}
class Tree{
    public Node root;
    public Tree(){
        root = null;
    }
    public void insert(String name,int count){
        Node newNode = new Node(name,count);
        if(root==null)
            root = newNode;
        else{
            Node current = root;
            Node parent;
            while(true){
                parent = current;
                if(count<current.count){
                    current = current.leftChild;
                    if(current==null){
                        parent.leftChild = newNode;
                        return;
                    }
                }
                else if(count>current.count){
                    current = current.rightChild;
                    if(current==null){
                        parent.rightChild = newNode;
                        return;
                    }
                }
            }
        }
    }
    public Node find(int key){
        Node current = root;
        while(true){
            if(current==null)
                return null;
            if(key==current.count)
                return current;
            else if(key<current.count){
                current = current.leftChild;
            }
            else if(key>current.count){
                current = current.rightChild;
            }
        }
    }
    public void preOrder(Node node){
        if(node!=null){
            System.out.print(node.name);
            preOrder(node.leftChild);
            preOrder(node.rightChild);
        }
    }
    public void midOrder(Node node){
        if(node!=null){
            midOrder(node.leftChild);
            System.out.print(node.name);
            midOrder(node.rightChild);
        }
    }
    public void lastOrder(Node node){
        if(node!=null){
            lastOrder(node.leftChild);
            lastOrder(node.rightChild);
            System.out.print(node.name);
        }
    }
    
    public void preOrderWithStack(Node node){
        Stack<Node> s = new Stack<Node>();
        Node current = node;
        while(current!=null||!s.isEmpty()){
            while(current!=null){
                System.out.print(current.name+" ");
                if(current.rightChild!=null){
                    s.push(current.rightChild);
                }
                current = current.leftChild;
            }
            if(!s.isEmpty()){
                current = s.pop();
            }
        }
        
    }
    public void inOrderWithStack(Node node){
        Node current = node;
        Stack<Node> s = new Stack<Node>();
        while(current!=null||!s.isEmpty()){
            while(current!=null){
                s.push(current);
                current = current.leftChild;
            }
            if(!s.isEmpty()){
                current = s.pop();
                System.out.print(current.name+" ");
                current = current.rightChild;
            }
        }
    }
    public static void postOrderWithStack(Node node){
        Node current;
        Node pre = null;
        Stack<Node> s= new Stack<Node>();
        s.push(node);
        while(!s.isEmpty()){
            current = s.peek();
            if((current.leftChild==null&&current.rightChild==null)||(pre!=null&&(pre==current.leftChild||pre==current.rightChild))){
                System.out.print(s.pop().name);//如果节点的左右子节点都为null 或者都被遍历过则可以访问
                pre = current;
            }else{
                if(current.rightChild!=null)
                    s.push(current.rightChild);
                if(current.leftChild!=null)
                    s.push(current.leftChild);
                
            }
            
        }
        
    }
    

}

ok 大功告成

posted on 2014-03-16 15:00  yaoboyyao  阅读(373)  评论(0编辑  收藏  举报

导航