树结点定义:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
前序遍历(根->左->右)
递归解法:
public static void preorderTraversalRec(TreeNode root) {
if (root == null) {
return;
}
System.out.print(root.val + " ");
preorderTraversalRec(root.left);
preorderTraversalRec(root.right);
}
非递归解法:
用一个辅助stack,要先压入右孩子,再压入左孩子,这样在出栈时会先打印左孩子再打印右孩子 。
public static void preorderTraversal(TreeNode root) {
if(root == null){
return;
}
// 辅助stack
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while( !stack.isEmpty() ){
// 出栈栈顶元素
TreeNode cur = stack.pop();
System.out.print(cur.val + " ");
if(cur.right != null){
stack.push(cur.right);
}
if(cur.left != null){
stack.push(cur.left);
}
}
}
中序遍历和后续遍历都与前序遍历类似,仅访问根节点的顺序不同。
分层遍历:
使用队列实现。分别将根结点、左结点、右结点入队,然后逐个出队即可。
public static void levelTraversal(TreeNode root) {
if (root == null) {
return;
}
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.push(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.removeFirst();
System.out.print(cur.val + " ");
if (cur.left != null) {
queue.add(cur.left);
}
if (cur.right != null) {
queue.add(cur.right);
}
}
}