一、题目
给你二叉树的根节点 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
}