树的遍历总结
树的遍历在算法题目中是比较常见的,树的遍历是指按照某种顺序访问树中的所有结点,同时保证不出现重复的结点。常见的树的遍历分为三种,分别为前序遍历,中序遍历和后续遍历,前中后是根节点相对于子节点的,比如前序遍历,那么首先遍历根节点,再遍历孩子结点,而中序遍历是先遍历左孩子结点,再遍历根节点,最后遍历右孩子结点,而后序遍历的话则是先遍历左节点,再遍历右节点,最后遍历根节点。树的遍历算法主要是递归和迭代,递归算法是比较简单,迭代算法就有点不好理解。
树的递归遍历
前序遍历
前序遍历的规则就是先遍历根节点,再遍历左孩子结点和右孩子结点。代码框架如下图所示:
public void preOrder(TreeNode root) {
if(root == null)
return;
System.out.println(root.val); //这里就是访问当前根节点,可以替换任何对当前根节点的操作
preOrder(root.left);
preOrder(root.right);
}
中序遍历
中序遍历的规则就是先遍历左孩子结点,接着访问根节点,再访问右孩子结点。代码框架如下图所示:
public void inOrder(TreeNode root) {
if(root == null)
return;
inOrder(root.left);
System.out.println(root.val); //同理可以替换成任何对根节点的操作
inOrder(root.right);
}
后序遍历
后序遍历的规则就是先遍历左孩子结点,接着右孩子结点,最后访问根节点
public void postOrder(TreeNode root) {
if(root == null)
return;
postOrder(root.left);
postOrder(root.right);
System.out.println(root.val); //同理可以替换成任何对根节点的操作
}
树的迭代遍历
前序遍历
public static void preOrder_v2(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(root != null || !stack.isEmpty()) {
root = stack.pop();
while(root != null) {
System.out.println(root.val);
if(root.right != null)
stack.push(root.right);
root = root.left;
}
}
}
中序遍历
public static void inOrder_v2(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while(root != null || !stack.isEmpty()) {
while(root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
System.out.println(root.val);
root = root.right;
}
}
后序遍历
public static void postOrder_v2(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pre = null;
while(root != null || !stack.isEmpty()) {
while(root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if(root.right == null || root.right == pre) {
System.out.println(root.val);
pre = root;
root = null;
} else {
stack.push(root);
root = root.right;
}
}
}