【数据结构】Java实现二叉树遍历(非递归)

以二叉排序树来建立的一棵二叉树,然后用先序,中序,后序非递归遍历

package DataStructure;

import java.util.Stack;  

public class BinaryTree {   

    private Node root;

    class Node{
        int data;
        Node left;
        Node right;
        public Node(int data){
            this.data = data;
            this.left = null;
            this.right= null;
           }
       }
       //构建一棵二叉树
       public BinaryTree(){
           root = null;
       }

       //二叉树添加节点
       public void buildTree(Node node,int data){
           if(root == null){
               root = new Node(data);
           }else{
               if(data>node.data){
                   if(node.right==null){
                       node.right=new Node(data);
                   }else{
                       buildTree(node.right,data);
                   }
               }else{
                   if(node.left==null){
                       node.left=new Node(data);
                   }else{
                       buildTree(node.left,data);
                   }
               }
           }
       }

    //前序遍历的非递归实现  
    public void PreOrder(Node n){  
        Stack<Node> stack=new Stack<Node>();  
        Node node=n;  
        while(node!=null||stack.size()>0){  
            while(node!=null){  
                visted(node);  
                stack.push(node);  
                node=node.left;  
            }   
                node=stack.pop();  
                node=node.right;    
        }  
    }      
    //中序遍历的非递归实现  
    public void InOrder(Node n){  
        Stack<Node> stack =new Stack<Node>();  
        Node node =n;  
        while(node!=null||stack.size()>0){  
            //存在左子树  
            while(node!=null){  
                stack.push(node);  
                node=node.left;  
            }  
            //栈非空  
            if(stack.size()>0){  
                node=stack.pop();  
                visted(node);  
                node=node.right;  
            }  
        }  
    }        
  //  后序遍历的非递归实现  
    public void PostOrder(Node p){  
        Stack<Node> stack=new Stack<Node>();  
        Node node =p;  
        while(p!=null){  
            for(;p.left!=null;p=p.left){  
                stack.push(p);  
            }  
            while(p!=null&&(p.right==null||p.right==node)){  
                visted(p);    
                node =p;  
                if(stack.empty())  
                    return;  
                p=stack.pop();  
            }  
            stack.push(p);  
            p=p.right;  
        }  
    }  
    public void visted(Node node){  
        System.out.print(" "+node.data);;  
    } 

       public static void main(String[] args){
           int a[]={62,88,58,47,35,73,51,99,37,93};
           BinaryTree bt = new BinaryTree();
           for(int i=0;i<a.length;i++){
               bt.buildTree(bt.root, a[i]);
           }
           System.out.println("先序遍历结果:");
           bt.PreOrder(bt.root);
           System.out.println();
           System.out.println("中序遍历结果:");
           bt.InOrder(bt.root);
           System.out.println();
           System.out.println("后序遍历结果:");
           bt.PostOrder(bt.root);
           System.out.println();
       }
    }    

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值