leetcode 二叉树遍历合集


一、题目

给你二叉树的根节点 root ,返回它节点值的遍历。
在这里插入图片描述

前序遍历

前序遍历即把根节点先输出,然后输出左节点和右节点

输入:root = [1,null,2,3]
输出:[1,2,3]

中序遍历

中序遍历即把左节点先输出,然后输出根节点和右节点

输入:root = [1,null,2,3]
输出:[1,3,2]

后序遍历

后序遍历即把左节点先输出,然后输出右节点和根节点

输入:root = [1,null,2,3]
输出:[3,2,1]

可以看出,前序/中序/后序遍历指的是根节点输出的顺序

二、解题思路

递归

递归的思路是将左子树、右子树分别进行递归,在遍历过程中输出节点的值。递归结束条件为节点为空。

以前序遍历为例:

func preorder(nodes []int, node *TreeNode) []int {
	// 前序遍历,按 根节点-左子树-右子树 的顺序输出
	if node == nil {
		return nodes
	}
	nodes = append(nodes, node.Val)
	nodes = preorder(nodes, node.Left)
	nodes = preorder(nodes, node.Right)
	return nodes
}

迭代

迭代的思路是先将节点存入堆栈中,将节点以左子树一直遍历下去并存入堆栈,如果节点为空,则将栈顶元素出栈,并将该节点的右节点更新为当前节点。

以中序遍历为例:

stack := make([]*TreeNode, 0)
for len(stack) > 0 || root != nil {
	for root != nil {
		stack = append(stack, root)
		root = root.Left
	}
	root = stack[len(stack)-1]
	stack = stack[:len(stack)-1]
	nums = append(nums, root.Val)
	root = root.Right
}

三、代码实现

递归实现
后序遍历golang实现

func postorderTraversal(root *TreeNode) (nodes []int) {
	return postorder(nodes, root)
}

func postorder(nodes []int, node *TreeNode) []int {
	// 后序遍历,按 左子树-右子树-根节点 的顺序输出
	if node == nil {
		return nodes
	}
	nodes = postorder(nodes, node.Left)
	nodes = postorder(nodes, node.Right)
	nodes = append(nodes, node.Val)
	return nodes
}

迭代实现
中序遍历golang实现

func inorderTraversal(root *TreeNode) []int {
	nums := make([]int, 0)
	stack := make([]*TreeNode, 0)
	for len(stack) > 0 || root != nil {
		for root != nil {
			stack = append(stack, root)
			root = root.Left
		}
		root = stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		nums = append(nums, root.Val)
		root = root.Right
	}

	return nums
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值