二叉樹的廣度優先遍歷和深度優先遍歷(Java實現)
阿新 • • 發佈:2019-02-12
對於節點的定義
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); } } }