二叉树的遍历--递归和非递归

 1 public class BinaryTree {
 2 
 3   class Node<T>{
 4 
 5     T data;
 6     Node<T> leftTree;
 7     Node<T> rightTree;
 8 
 9     public Node(T data) {
10       this.data = data;
11     }
12   }
13   //先序遍历
14   private <T> void DLR(Node<T> node){
15     if(node==null){
16       return;
17     }
18     System.out.println(node.data);
19     DLR(node.leftTree);
20     DLR(node.rightTree);
21   }
22   //中序遍历
23   private <T> void LDR(Node<T> node){
24     if(node==null){
25       return;
26     }
27     DLR(node.leftTree);
28     System.out.println(node.data);
29     DLR(node.rightTree);
30   }
31   //后序遍历
32   private <T> void LRD(Node<T> node){
33     if(node==null){
34       return;
35     }
36     DLR(node.leftTree);
37     DLR(node.rightTree);
38     System.out.println(node.data);
39   }
40 
41 }
非递归实现

 

public class BinaryTree {

  class Node<T>{

    T data;
    Node<T> leftTree;
    Node<T> rightTree;

    public Node(T data) {
      this.data = data;
    }
  }
  //先序遍历 从上到下-从左到右
  private <T> void DLR(Node<T> node){
    if(node==null){
      return;
    }
    Stack<Node<T>>stack=new Stack<>();
    LinkedList<Node<T>>outPut=new LinkedList<>();
    stack.push(node);
    while (!stack.isEmpty()){
      //先从栈中取出节点并存入队列中
      outPut.push(node);
      //因为接下来是处理左孩子--根据栈的先进后出原理,所以先把右孩子放进栈中再把左孩子放进栈中
      if(node.rightTree!=null){
        stack.push(node.rightTree);
      }
      if(node.leftTree!=null){
        stack.push(node.leftTree);
      }
    }
    
  }
  //中序遍历--从左到右 从下到上
  private <T> void LDR(Node<T> node){
    if(node==null){
      return;
    }
    Stack<Node<T>>stack=new Stack<>();
    LinkedList<Node<T>>outPut=new LinkedList<>();
    Node<T>curNode=node;
    while (curNode!=null||!stack.isEmpty()){
      while (curNode!=null){
        stack.push(curNode);
        curNode=curNode.leftTree;
      }
      curNode=stack.pop();
      outPut.push(curNode);
      //切换到右边的分支---开始最外面的循环先加入左分支 在处理右分支
      curNode=curNode.rightTree;
    }
 
  }
  //后序遍历--其实就是先序遍历中先放左孩子再放右孩子,然后用栈来保存
  private <T> void LRD(Node<T> node){
    if(node==null){
      return;
    }
    Stack<Node<T>>stack=new Stack<>();
    Stack<Node<T>>outPut=new Stack<>();
    stack.push(node);
   while (!stack.isEmpty()){
     outPut.push(node);
     if(node.leftTree!=null){
       stack.push(node.leftTree);
     }
     if(node.rightTree!=null){
       stack.push(node.rightTree);
     }
   }

  }

}

 

posted @ 2020-03-14 15:03  lianzhen  阅读(122)  评论(0编辑  收藏  举报