题目描述:具体描述见原题。简单来说就是中序遍历二叉树。
解题思路:先遍历左子树,访问根节点,在遍历右子树。具体过程见代码,建议还是采取非递归解题,能感受一下具体出栈入栈过程。
具体代码:
// 非递归
func inorderTraversal(root *TreeNode) []int {
if root == nil {
return nil
}
s, r := make([]*TreeNode, 0), make([]int, 0) // 利用切片模拟一个栈
for root != nil || len(s) != 0 {
if root != nil { // 先遍历左子树
s = append(s, root) // 将节点入栈
root = root.Left
} else { // 该节点无左子节点
n := s[len(s)-1] // 出栈,相当于访问根节点
r = append(r, n.Val)
s = s[:len(s)-1]
root = n.Right // 遍历右子树
}
}
return r
}
//递归解法
func inorderTraversal(root *TreeNode) []int {
output := make([]int, 0)
inorder(root, &output)
return output
}
func inorder(root *TreeNode, output *[]int) {
if root != nil {
inorder(root.Left, output) // 递归遍历左子树
*output = append(*output, root.Val) // 访问根节点
inorder(root.Right, output) // 递归遍历右子树
}
}
补充说明:中序遍历二叉树也是基础知识了,每次写都会想起夏天晚上老熊的数据结构课,是我大学里印象深刻的课程之一。