遍历二叉树的模板方法

二叉树

示意图

1
2
3
4
5
6
7

遍历序列

  • 先序遍历序列:[4、2、1、3、6、5、7]
  • 中序遍历序列:[1、2、3、4、5、6、7]
  • 后续遍历序列:[1、3、2、5、7、6、4]

遍历方案

二叉树节点

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;

	TreeNode(int val) {
		this.val = val;
	}
}

先序遍历(深度优先)

  • 递归方案
public static void preorder(TreeNode root, List<TreeNode> result) {

	if (root == null) {
		return;
	}

	result.add(root);
	preorder(root.left, result);
	preorder(root.right, result);
}
  • 非递归方案
public void preorder(TreeNode root, List<TreeNode> result) {

	TreeNode cur = root;
	Stack<TreeNode> stack = new Stack<>();

	while (cur != null || !stack.isEmpty()) {

		if (cur != null) {
			result.add(cur);

			stack.push(cur);
			cur = cur.left;
		}
		else {
			cur = stack.pop();
			cur = cur.right;
		}
	}
}

中序遍历

  • 递归方案
public static void inorder(TreeNode root, List<TreeNode> result) {

	if (root == null) {
		return;
	}

	inorder(root.left, result);
	result.add(root);
	inorder(root.right, result);
}
  • 非递归方案
public static void inorder(TreeNode root, List<TreeNode> result) {

	TreeNode cur = root;
	Stack<TreeNode> stack = new Stack<>();

	while (cur != null || !stack.isEmpty()) {
		if (cur != null) {
			stack.push(cur);
			cur = cur.left;
		}
		else {
			cur = stack.pop();
			result.add(cur);
			cur = cur.right;
		}
	}
}

后续遍历

  • 递归方案
public static void postorder(TreeNode root, List<TreeNode> result) {

	if (root == null) {
		return;
	}

	postorder(root.left, result);
	postorder(root.right, result);
	result.add(root);
}
  • 非递归方案
public static void postorder(TreeNode root, List<TreeNode> result) {

	TreeNode cur = root, last = null;
	Stack<TreeNode> stack = new Stack<>();

	while (cur != null || !stack.isEmpty()) {
		if (cur != null) {
			stack.push(cur);
			cur = cur.left;
		}
		else {
			cur = stack.peek();
			if (cur.right == null || cur.right == last) {
				result.add(cur);

				stack.pop();
				last = cur;
				cur = null;
			}
			else {
				cur = cur.right;
			}
		}
	}
}

层次遍历(广度优先遍历)

public List<TreeNode> levelOrder(TreeNode root) {

	List<TreeNode> list = new LinkedList<>();

	if (root == null) {
		return list;
	}

	Queue<TreeNode> queue = new LinkedList<>();
	queue.offer(root);

	while (!queue.isEmpty()) {

		TreeNode node = queue.poll();
		list.add(node);

		if (node.left != null) {
			queue.offer(node.left);
		}

		if (node.right != null) {
			queue.offer(node.right);
		}
	}

	return list;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值