美文网首页算法学习打卡计划
leetcode第九十四、一百四十四、一百四十五题—二叉树的前序

leetcode第九十四、一百四十四、一百四十五题—二叉树的前序

作者: 不分享的知识毫无意义 | 来源:发表于2020-02-28 18:27 被阅读0次

    这是一个系列,关于二叉树的,这个吧,接下来几天重点看这个了。
    这个系列,把前中后都讲了吧

    1.题目

    给定一个二叉树,返回它的 前序/中序/后序 遍历。
    要求,递归比较简单,用分治的思路解决。

    2.解析

    (1)递归
    递归简单,定义一个函数,满足下面条件:
    注意遍历起名字都站在父节点的视角
    1)先序遍历:
    先父再左再右
    2)中序遍历:
    先左再父再右
    3)后序遍历:
    先左再右再父
    这个实现简单,就是一个先后顺序的问题,也就是list再哪append的问题。
    (2)循环
    循环记住一个思路即可:
    树的遍历基本都要用到栈这个数据结构。
    1)先序遍历
    先序遍历的想法就是,每次都先更新父节点的值,因此就把append这个放在第一个循环里,这样就保证先中再左再右。
    2)中序遍历
    一步步来思考,先走左边,再存现在,最后走右边。一个栈,每次push左节点,直至为空,注意压进去的还是一颗树。然后这个栈每次出一个左节点,来个列表存值,然后遍历他的右节点。直到stack和root都是空。
    3)后序遍历
    后序遍历其实是先序遍历的逆过程。首先走左节点,然后走右节点,然后走中间节点,怎么控制右节点呢就是把左节点入栈,然后遍历完右节点,遍历左节点,最后做个倒序列。

    3.python代码

    #节点定义
    class Node:
        def __init__(self,  x):
            self.val = x
            self.left = None
            self.right = None
    #递归
    #先序遍历
    class Solution:
        def preorderTraversal(self, root):
            if not root:
                return []
            return [root.val] +self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
    #中序遍历
    class Solution:
        def preorderTraversal(self, root):
            if not root:
                return []
            return self.preorderTraversal(root.left) + [root.val] + self.preorderTraversal(root.right)
    #后序遍历
    class Solution:
        def preorderTraversal(self, root):
            if not root:
                return []
            return self.preorderTraversal(root.left) + self.preorderTraversal(root.right)+ [root.val] 
    #循环
    #先序遍历
    class Solution:
        def preorderTraversal(self, root):
            stack = []
            listout = []
            cur = root
            while cur or stack:
                if cur:
                    listout.append(cur.val)
                    stack.append(cur)
                    cur = cur.left
                else:
                    cur = stack.pop()
                    cur = cur.right
                    # if cur:
                    #     listout.append(cur.val)
            return listout
    #中序遍历
    class Solution:
        def inorderTraversal(self, root):
            stack = []
            listout = []
            cur = root
            while stack or cur:
                if cur:
                    stack.append(cur)
                    cur = cur.left
                else:
                    cur = stack.pop()
                    listout.append(cur.val)
                    cur = cur.right
            return listout
    #后序遍历
        class Solution:
            def postorderTraversal(self, root):
                stack = []
                listout = []
                cur = root
                while cur or stack:
                    if cur:
                        listout.append(cur.val)
                        stack.append(cur.left)
                        cur = cur.right
                    else:
                        cur = stack.pop()
                return listout[::-1]
    
    
    

    相关文章

      网友评论

        本文标题:leetcode第九十四、一百四十四、一百四十五题—二叉树的前序

        本文链接:https://www.haomeiwen.com/subject/ktykhhtx.html