【LeetCode】94. 二叉树的中序遍历

本文详细介绍了如何使用递归和迭代两种方法实现二叉树的中序遍历。递归方式遵循左根右的顺序,通过函数调用自身完成遍历;迭代方式利用栈存储节点,从根节点开始向左遍历,直到找到最左节点,然后出栈并访问,再检查右节点。这两种方法都是深度优先搜索的典型应用。
摘要由CSDN通过智能技术生成


解题思路:

(一)

二叉树的中序排列为 左根右,先遍历左半部分,然后根结点,再右半部分。

对左半部分又可以按照初始状态进行划分,右半部分也是一样,可以使用递归

先取根节点的左节点递归,如果左节点为空说明到最左边了,这时该节点为这层的根节点,由左根右顺序,把不用递归的根结点添加到栈中,在进行递归该根结点的右子节点,没有的话返回


递归实现时,是函数自己调用自己,一层层的嵌套下去,操作系统/虚拟机自动帮我们用  来保存了每个调用的函数

递归是一个树结构,从字面可以其理解为重复“递推”和“回归”的过程,当“递推”到达底部时就会开始“回归”,其过程相当于树的深度优先遍历。

调用过程:

dfs(root.left)
	dfs(root.left)
		dfs(root.left)
			为null返回
		打印节点
		dfs(root.right)
			dfs(root.left)
				dfs(root.left)
				........

递归实现

        res = []    #存储结点值
        def dg(root):
            if not root:        #如果当前结点为空,返回  ,进行加入结点值
                return
            dg(root.left)   #按照左,加入根,右方式遍历
            res.append(root.val)    
            dg(root.right)
        dg(root)    #调用自己
        return res

(二)

使用迭代:重复反馈过程的活动,每一次迭代的结果会作为下一次迭代的初始值。(A重复调用B)

迭代是一个环结构,从初始状态开始,每次迭代都遍历这个环,并更新状态,多次迭代直到到达结束状态。

:从根节点出发向左节点,每到一个节点就存储到栈中,最后一个进入的节点是最左结点,然后出栈,保存其元素值,查看其右节点,有的话,入栈,从该节点出发向左节点,若无右节点,继续出栈,循环,直到结点全部入栈并且出栈,结束

if not root:
            return []
        res = []        #存储结点值
        stack = []      #暂时保存结点,相当于栈
        cur = root      #设置指针
        while cur or stack:     #当cur指向值和栈为空时说明没有元素了
            while cur :     #把从根到左一条路依次加入栈
                stack.append(cur)
                cur = cur.left
            node = stack.pop()  #到达最后,就把栈中最后一个结点值取出加入结果res中
            res.append(node.val)
            cur = node.right     #在看这个节点的右子节点,循环
        return res      #当所有结点加入栈中,最后出栈完后,res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

onlywishes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值