• 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 大功告成

  • 相关阅读:
    BZOJ5104 二次剩余板子
    BZOJ5329 [Sdoi2018]战略游戏 圆方树+虚树
    BZOJ1095 动态点分治
    BZOJ3992: [SDOI2015]序列统计
    kd-tree板子
    thusc2018翻车记
    BZOJ5336 DP套DP
    BZOJ4316 仙人掌DP
    问题 F: 最小花费
    问题 C: 热浪
  • 原文地址:https://www.cnblogs.com/yaoboyyao/p/3603366.html
Copyright © 2020-2023  润新知