树是数据结构中一个非常重要的内容,本文介绍关于树的前序、中序、后序遍历算法,分为递归和迭代两种不同的形式。
递归解法
递归的思路很简单,就是要清楚你想要做什么,什么时候停止。
前序遍历
代码片段
public static void preOrderRecur(TreeNode root){
if(root == null){
return;
}
//前序遍历输出为gen左右
//所以先处理根
System.out.print(root.value + " ");
//再处理左子树
preOrderRecur(root.left);
//处理右子树
preOrderRecur(root.rigth);
}
中序遍历
代码片段
public static void inOrderRecur(TreeNode root){
if(root == null){
return;
}
//中序遍历顺序为左根右
//先处理左子树
inOrderRecur(root.left);
//处理根
System.out.print(root.value + " ");
inOrderRecur(root.right);
}
后序遍历
代码片段
public static void postOrderRecur(TreeNode root){
if(root == null){
return;
}
//后序遍历的输出顺序是左右根
//先处理左子树
postOrderRecur(root.left);
postOrderRecur(root.right);
System.out.print(root.value + " ");
}
迭代解法
本质上是在模拟递归,因为递归的过程中使用了系统栈,所以在迭代的解法中常用Stack来模拟系统栈。
前序遍历
首先我们创建一个Stack用来存放节点。前序遍历的顺序是根左右,因为栈的特点是后进先出,所以入栈顺序应为右左根,此时代码片段如下:
public static void preOrderIteration(TreeNode root){
if(root == null){
return;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
System.out.print(node.value + " ");
if(root.rigth != null){
stack.push(node.right);
}
if(node.left != null){
stack.push(node.left);
}
}
}
中序遍历
1.同理创建一个Stack,然后按左 中 右的顺序输出节点。
2.尽可能的将这个节点的左子树压入Stack,此时栈顶的元素是最左侧的元素,其目的是找到一个最小单位的子树(也就是最左侧的一个节点),并且在寻找的过程中记录了来源,才能返回上层,同时在返回上层的时候已经处理完左子树了。
3.当处理完最小单位的子树时,返回到上层处理了中间节点。
4.如果有右节点,其也要进行中序遍历。
代码片段:
public static void inOrderIteration(TreeNode root){
if(root == null){
return;
}
TreeNode cur = root;
Stack<TreeNode> stack = new Stack<>();
while(!stack.isEmpty() || cur != null){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
TreeNode node = stack.pop();
System.out.print(node.value + " ");
if(node.right != null){
cur = node.right;
}
}
}
后序遍历
代码片段:
public static void postOrderIteration(TreeNode root){
if(root == null){
return;
}
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
stack1.push(root);
while(!stack1.isEmpty()){
TreeNode node = stack1.pop();
stack2.push(node);
if(node.left != null){
stack1.push(node.left);
}
if(node.right != null){
stack1.push(node.right);
}
}
while(!stack2.isEmpty){
System.out.print(stack2.pop().value + "");
}
}
以上就是树的三种遍历方式的代码模板,大家有更好的想法都欢迎在下面评论哟!