二叉树的前序、中序、后序遍历方法合集

二叉树的前序、中序、后序遍历方法合集_第1张图片
树是数据结构中一个非常重要的内容,本文介绍关于树的前序、中序、后序遍历算法,分为递归和迭代两种不同的形式。

递归解法

递归的思路很简单,就是要清楚你想要做什么,什么时候停止

前序遍历

代码片段


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 + "");
	}
}

以上就是树的三种遍历方式的代码模板,大家有更好的想法都欢迎在下面评论哟!

你可能感兴趣的:(数据结构,二叉树,数据结构,栈)