文章目录
前提要素
本文代码用Java实现。
//二叉树节点结构
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) {
val = x;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
//打印二叉树节点值
private static void print(TreeNode node, StringBuilder sb) {
sb.append(node.val);
sb.append(',');
}
深度优先搜索DFS
经典遍历算法
Depth-first traversal (dotted path) of a binary tree:
- Pre-order (node access at position red color dot):
- F, B, A, D, C, E, G, I, H;
- In-order (node access at position green color dot):
- A, B, C, D, E, F, G, H, I;
- Post-order (node access at position blue color dot):
- A, C, E, D, B, H, I, G, F.
前序遍历
递归版
public static String recursivePreorderTraverse(TreeNode root) {
if(root == null) return "";
StringBuilder sb = new StringBuilder();
recursivePreorderTraverse(root, sb);
return sb.substring(0, sb.length() - 1);
}
private static void recursivePreorderTraverse(TreeNode node, StringBuilder sb) {
if (node == null)
return;
print(node, sb);
recursivePreorderTraverse(node.left, sb);
recursivePreorderTraverse(node.right, sb);
}
迭代版
public static String iterativePreorderTraverse(TreeNode root) {
if(root == null)
return "";
StringBuilder sb = new StringBuilder();
LinkedList<TreeNode> stack = new LinkedList<>();
stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
print(node, sb);
//right child is pushed first so that left is processed first
if(node.right != null)
stack.push(node.right);
if(node.left != null)
stack.push(node.left);
}
return sb.substring(0, sb.length