java通过栈实现树的遍历

实现代码

package traversalTree;
import java.util.*;
import java.util.Scanner;

class NodeType{
    NodeType left, right;
    int value;

    public NodeType( int _value){
        this.value = _value;
        left = null;
        right = null;
    }
    public NodeType(){

    }
}


public class traversalTree {

    NodeType root = null;
    static int i = 0;
    private int[] arr;
    public NodeType buildTree(){
        int t = arr[i];
        NodeType node = new NodeType();
        if(t==0)
           return null;
        node.value = t;
        i++;
        node.left = buildTree();
        i++;
        node.right = buildTree();
        return node;
    }



    public void preTraversal( ){
      Stack  a = new Stack();
      a.push(root);
      NodeType t;
      while( !a.isEmpty() ){
          t = (NodeType)a.pop();
          //System.out.println(a.isEmpty() );
          while( t!=null){
              System.out.println(t.value);
              if(t.right!=null)
                  {a.push(t.right);}
              t = t.left;     
          }
      }
    }

    public void midTraversal(){
        Stack a = new Stack();

        NodeType t=root;
        while( t!=null || !a.isEmpty() ){
            while(t!=null){
                a.push(t);
                t = t.left;
            }
            t = (NodeType)a.pop();
            System.out.println(t.value);
            t = t.right;
        }
    }

    public void postorderTraversal(){
        int[] sign = new int[20];
        Stack stack = new Stack();
        NodeType t = new NodeType();
        t = root;
        if( t==null )
            return;

        while(t!=null){
            stack.push(t);
            sign[ stack.size()-1] = 0;
            t = t.left;
        }
        while(!stack.isEmpty() ){
            t = (NodeType)stack.peek();

            while( t.right!=null && sign[stack.size()-1]==0 ){
                sign[stack.size()-1] = 1;
                t = t.right;
                while(t!=null){
                    stack.push(t);
                    sign[stack.size()-1] = 0;
                    t = t.left;
                }
                t = (NodeType)stack.peek();

            }
            System.out.println( t.value);
            stack.pop();
        }


    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
       int[] a = {1,2,3, 0,4,0,0, 5,6,0,0,0,7,8,0,10,0,0,9 , 0, 0};
       /*                             1
        *                          2     7
        *                       3     5  8  9
        *                         4 6      10
        */

       traversalTree tree = new traversalTree();
       tree.arr = a;
       Integer i = 0;
       tree.root = tree.buildTree();
       tree.postorderTraversal();

    }

}

实现的语言解释

       对于树的前序遍历过程,我们每到达一个节点,就会访问该节点,所以这个节点就会直接被访问掉,从而无须保存到栈中。因为没有将节点的保存到栈中,所以为了保证不丢失节点的右节点的信息,所以我们需要将访问过的节点的右孩子保存到栈中。
       对于树的中序遍历过程,由于需要一个栈将到达该节点的中序遍历最先需要访问的节点的路上的节点保存到栈中,然后对于访问掉那个节点后,他的左子树和本身可以直接丢弃,而代码可以直接进入他的右子树,所以中序遍历的过程中栈保存的节点都是,通往左子树的最左节点的路径上的节点。
       对于树的后续遍历,由于要多次经过每个节点,所以要设置一个状态变量来指示到达一个节点后是进入右子树,还是他是从右子树返回的不再需要进入右子树了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值