LeetCode0094.二叉树的中序遍历 Go语言AC笔记

23 篇文章 0 订阅

时间复杂度:O(n),空间复杂度:O(n)

解题思路

递归法

最最最最常用的方法,优先遍历左孩子直至为空,如果为空就返回然后将根节点的值放入数组中,再从右孩子开始重复以上步骤。

扩展:如果是先序遍历和后序遍历呢?

先序遍历就是优先输出根节点的值,再然后就是遍历左孩子,最后遍历右孩子。

后序遍历就是优先遍历左孩子,然后遍历右孩子,最后输出根节点的值。

通过三者比对应该就会发现先序遍历、中序遍历和后序遍历的递归代码规律了吧。

迭代法

迭代法在做题时不是很常用,因为需要我们自己来维护一个栈,但是它在工程项目中要优于递归法,原因还是我们可以自己维护一个栈,自己来设定栈的大小,不会发生递归时栈溢出的情况。

简单来说就是遇到一个根节点就把它放到栈中,然后再去遍历它的左孩子,直至没有左孩子,那就返回栈顶的结点、输出值,再去找它的右孩子,然后就是重复以上的步骤了。

AC代码

递归法

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func inorderTraversal(root *TreeNode) (res []int) {
    var inOrder func(root *TreeNode)//单独声明函数值,防止递归代码编译出错
    inOrder=func(root *TreeNode){
        if root==nil{
            return
        }
        inOrder(root.Left)
        res=append(res,root.Val)
        inOrder(root.Right)
    }
    inOrder(root)
    return res
}

迭代法

偷个懒用的官方题解代码,自己加了点注释

func inorderTraversal(root *TreeNode) (res []int) {
	stack := []*TreeNode{}
    //栈为空就说明遍历完了所有结点
	for root != nil || len(stack) > 0 {
		for root != nil {
			stack = append(stack, root)//令根结点入栈
			root = root.Left//优先遍历左孩子
		}
        //root为空了,接下来保存根节点的值
		root = stack[len(stack)-1]//
		stack = stack[:len(stack)-1]
		res = append(res, root.Val)
		root = root.Right//最后才是遍历右孩子
	}
	return
}

感悟

非常非常基础的中序遍历,第一反应都能想到递归法,但是迭代法也应该学习一下,在企业开发中还是可能会遇到的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值