题目:
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
输入:root = [1,null,2,3]
输出:[1,3,2]
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func inorderTraversal(root *TreeNode) []int {
res := []int{}
var traversal func(node *TreeNode)
traversal = func(node *TreeNode) {
if node == nil {
return
}
traversal(node.Left)
res = append(res, node.Val)
traversal(node.Right)
}
traversal(root)
return res
}
题目:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
// 代码一刷,前序遍历——迭代法
func preorderTraversal(root *TreeNode) []int {
res := []int{}
if root == nil {
return res
}
stack := list.New()
stack.PushBack(root)
for stack.Len() > 0 {
node := stack.Remove(stack.Back()).(*TreeNode)
res = append(res, node.Val)
if node.Right != nil {
stack.PushBack(node.Right)
}
if node.Left != nil {
stack.PushBack(node.Left)
}
}
return res
}
// 迭代——代码一刷,后序遍历
// go语言没有反转,自己实现一下下
func postorderTraversal(root *TreeNode) []int {
res := []int{}
if root == nil {
return res
}
stack := list.New()
stack.PushBack(root)
for stack.Len() > 0 {
node := stack.Remove(stack.Back()).(*TreeNode)
res = append(res, node.Val)
if node.Left != nil {
stack.PushBack(node.Left)
}
if node.Right != nil {
stack.PushBack(node.Right)
}
}
return Reverse(res)
}
func Reverse(res []int) []int {
n := len(res)
for i:=0; i<n/2; i++ {
res[i], res[n-i-1] = res[n-i-1], res[i]
}
return res
}
// 迭代,栈模拟,代码一刷
// 注意想明白,栈的模拟过程,不行就画个流程图
func inorderTraversal(root *TreeNode) []int {
res := []int{}
if root == nil {
return res
}
stack := list.New()
cur := root
for cur != nil || stack.Len() > 0 {
if cur != nil {
stack.PushBack(cur)
cur = cur.Left
} else {
cur = stack.Remove(stack.Back()).(*TreeNode)
res = append(res, cur.Val)
cur = cur.Right
}
}
return res
}
题目:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
func preorderTraversal(root *TreeNode) []int {
res := []int{}
if root == nil{
return res
}
stack := list.New()
stack.PushBack(root)
var node *TreeNode
for stack.Len() > 0 {
e := stack.Back()
stack.Remove(e)
if e.Value == nil {
e = stack.Back()
stack.Remove(e)
node=e.Value.(*TreeNode)
res = append(res, node.Val)
continue
}
node = e.Value.(*TreeNode)
// 前序,中左右,对应右左中
if node.Right != nil {
stack.PushBack(node.Right)
}
if node.Left != nil {
stack.PushBack(node.Left)
}
stack.PushBack(node)
stack.PushBack(nil)
}
return res
}
题目: