leetcode-94

173 阅读1分钟

题目描述:具体描述见原题。简单来说就是中序遍历二叉树。

解题思路:先遍历左子树,访问根节点,在遍历右子树。具体过程见代码,建议还是采取非递归解题,能感受一下具体出栈入栈过程。

具体代码:

// 非递归
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) // 递归遍历右子树
    }
}

补充说明:中序遍历二叉树也是基础知识了,每次写都会想起夏天晚上老熊的数据结构课,是我大学里印象深刻的课程之一。