1. 程式人生 > >二叉樹的廣度優先遍歷和深度優先遍歷(Java實現)

二叉樹的廣度優先遍歷和深度優先遍歷(Java實現)

對於節點的定義

class ListNode{
      ListNode left;
      ListNode right;
      int val;
      public ListNode(int value){
            this.val=value;
      }
}

廣度優先遍歷:

                                                            

對於廣度優先遍歷,通過佇列這個資料結構可以實現,如下圖所示,上面的一行是每次迴圈佇列中的元素,下面的一行是每次遍歷的元素。

                                      

public void levelOrderTraversal(LsitNode node){
      if(node==null){
            System.out.print("empty tree"); 
            return;
      }
      ArrayDeque<ListNode> deque = new ArrayDeque<ListNode>();
      deque.add(node);
      while(!deque.isEmpty()){
            ListNode rnode = deque.remove();
            System.out.print(rnode.val+"  ");
            if(rnode.left!=null){
                  deque.add(rnode.left);
            }
            if(rnode.right!=null){
                  deque.add(rnode.right);
            }
      }
}

深度優先遍歷:上面一行是棧每次迴圈時保留的資料,每次讀只能從最頂端pop()

                              

public void depthTraversal(ListNode node){
       if(node==null){
             System.out.print("empty tree");
             return;
       }
       Stack<ListNode> stack = new Stack<ListNode>();
       stack.push(node);
       while(!stack.isEmpty()){
             ListNode rnode = stack.pop();
             System.out.print(rnode.val);
             if(rnode.right!=null){
                   stack.push(rnode.right);
             }
             if(rnode.left!=null){
                   stack.push(rnode.left);
             }
       }
}