二叉樹的深度優先遍歷(DFS)與廣度優先遍歷(BFS)
深度優先遍歷:從根節點出發, 沿着左子樹的方向進行縱向遍歷,直到找到葉子節點爲之, 然後回溯到前一個節點, 進行右子樹節點的遍歷,直到遍歷完所有可達節點爲止
廣度優先遍歷: 從根節點出發,在橫向遍歷二叉樹層段節點的基礎上縱向遍歷二叉樹層次
A
B C
D E F G
DFS: ABDECFG
BFS: ABCDEFG
非遞歸
DFS實現: 數據結構 (棧)
父節點入棧, 父節點出棧, 先右子節點入棧, 後左子節點入棧, 遞歸遍歷全部節點
public void depthFirstSearch(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
if (null == root) return;
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
list.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.right);
}
}
}
BFS實現: 數據結構 (隊列)
父節點入隊,父節點出隊列,先左子節點入隊,後右子節點入隊。遞歸遍歷全部節點即可
public void breadthFirstSearch(TreeNode root) {
Queue<TreeNode> queue = new Queue<>();
List<Integer> list = new ArrayList<>();
queue.push(root);
while (!queue.isEmpty()) {
TreeNode node = queue.pop();
list.add(node.val);
if (node.left != null) {
queue.push(node.left);
}
if (node.right != null) {
queue.push(node.right);
}
}
}
遞歸
public void depthOrderTraversalWithRecursive(TreeNode root) {
depthTraversal(root);
}
private void depthTraversal(TreeNode node) {
if (null == node) return;
depthTraversal(node.left);
depthTraversal(node.right);
}