94. 二叉树的中序遍历

前序遍历,并且和我以前写的非递归前序遍历实现形式上并不一样
是先入根节点,然后开始
1.出栈
2.打印
3.先右后左的入栈
这样的打印出来的就是根左右

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def fun1(root):#二叉树的前序遍历的递归形式,非递归代码
    '''
        思路:
            1.将当前栈顶元素出栈
            2.打印弹出节点
            3.先右再左的压栈
            4.不断重复这个过程
    :param root:
    :return:
    '''
    stack=[root]  #首先将根节点入栈
    ls=[]
    while stack:#栈不为空 可以进来
        root=stack.pop()
        ls.append(root.val)
        stack.append(root.right)
        stack.append(root.left)
    return ls

这个是和上面思路一样,不过是根右左的遍历方式
这样逆序输出的时候就是左右根的后序遍历

def fun2(root):#后序遍历
    '''
        先把根节点入栈
        前序遍历是根左右,那么我如果根右左的方式遍历会得到什么,准备一个收集栈
            1.出栈
            2.打印
            3.先左再右(先打印右边的根,在打印左边的根)
        就是说我先以根右左的方式进行遍历,但是不打印全部入栈
        这个时候我逆序输出不就是左右根了吗
    :param root:
    :return:
    '''
    if root == None:
        return []

    stack = [root]
    souzhan = []
    while stack:  # 栈不为空则进来
        root = stack.pop()
        souzhan.append(root.val)
        if root.left:
            stack.append(root.left)
        if root.right:
            stack.append(root.right)
    souzhan.reverse()
    return souzhan

前序遍历的另一种非递归形式

def fun3(root):#前序遍历的另外一种非递归形式
    stack=[]
    ls=[]
    while stack or root:#只要栈不为空,或者根节点不为空则进来
        while root:#当前节点不为空,往左走
            stack.append(root)#往栈里面添加节点
            ls.append(root)#往ls里面添加节点
            root=root.left
        #循环结束意味着当前节点为空走到了能走到的最左边
        root=stack.pop().right
    return ls

中序遍历,具体的实现和前序的非递归长得很相似
记住前序后序基本上就没问题了

def fun4(root):
    stack = []
    ls = []
    while stack or root:  # 只要栈不为空,或者根节点不为空则进来
        while root:  # 当前节点不为空,往左走
            stack.append(root)  # 往栈里面添加节点
            root = root.left
        # 循环结束意味着当前节点为空走到了能走到的最左边

        root = stack.pop()
        ls.append(root.val)  # 往ls里面添加节点
        root=root.right
    return ls
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值