美文网首页
【Leetcode】树的遍历(前、中、后、层序)

【Leetcode】树的遍历(前、中、后、层序)

作者: 李白开水 | 来源:发表于2020-07-20 15:07 被阅读0次

前序遍历

144. 二叉树的前序遍历

递归:

  • 返回的结果为res数组,遇到一个点,如果这个点存在,就把这个点的值append到res中,如果不存在,返回res
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        return self.helper(root, [])

    def helper(self, node, res):
        if not node:
            return res
        res.append(node.val)
        self.helper(node.left, res)
        self.helper(node.right, res)
        return res

迭代:

  • 注意left和right的顺序
  • 因为pop是pop出数组的最后一个元素,所以要把right节点压在栈底,把left节点放在后面,这样才能先遍历left
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        stack = [root]
        res = []
        while stack:
            cur = stack.pop()
            res.append(cur.val)
            if cur.right:
                stack.append(cur.right)
            if cur.left:
                stack.append(cur.left)
        return res

如果加在前面可以这样写:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        stack = [root]
        res = []
        while stack:
            cur = stack.pop(0)
            res.append(cur.val)
            if cur.right:
                stack = [cur.right] + stack
            if cur.left:
                stack = [cur.left] + stack
        return res

589. N叉树的前序遍历

递归:

  • 节点的children是list
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        return self.helper(root, [])

    def helper(self, node, res):
        if not node:
            return res
        res.append(node.val)
        for i in node.children:
            self.helper(i,res)
        return res

迭代:

  • 每个节点的children是一个list,所以list和list之间直接+
  • 因为pop是pop出最后一个元素,为了先遍历左边的节点,children的list要逆序
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        if not root:
            return []
        stack = [root]
        res = []

        while stack:
            cur = stack.pop()
            res.append(cur.val)
            if cur.children:
                stack += cur.children[::-1]
        return res

中序遍历

94. 二叉树的中序遍历

  • 遍历,如果当前节点还有左节点,继续遍历树
  • 如果当前节点没有左节点,把当前节点的值加到结果集中
  • 遍历当前节点的右节点
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        return self.helper(root, [])
    
    def helper(self, node, res):
        if not node:
            return res
        if node.left:
            self.helper(node.left, res)
        res.append(node.val)
        if node.right:
            self.helper(node.right, res)
        return res

迭代:

  • 如果当前节点不为空,把当前节点加到栈中
  • 如果当前节点为空,把栈中的最后一个节点pop出来,把这个节点的值加到结果集中,把这个节点的右节点赋给当前节点
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        stack = []
        cur = root
        while cur or stack:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop()
                res.append(cur.val)
                cur = cur.right
        return res

后序遍历

145. 二叉树的后序遍历

递归:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        return self.helper(root, [])
    
    def helper(self, node, res):
        if not node:
            return res
        if node.left:
            self.helper(node.left, res)
        if node.right:
            self.helper(node.right, res)
        res.append(node.val)
        return res

迭代:

  • 右——左——根
  • 第一个栈用来保存:根——弹出根——左——右
  • 第二个栈:根——右——左
  • 这样把第二个栈逆序后得到:左——右——根
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        stack = [root]
        stack2 = []
        while stack:
            node = stack.pop()
            stack2.append(node)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        return [i.val for i in stack2[::-1] ]

或:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        
        tmp = [root]
        res = []
        while tmp:
            cur = tmp.pop()
            res.append(cur.val)
            if cur.left:
                tmp.append(cur.left)
            if cur.right:
                tmp.append(cur.right)
        return res[::-1]

590. N叉树的后序遍历

递归:

  • 如果有孩子,先遍历孩子
  • 如果没有孩子了,把当前的节点的值加到res中
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def postorder(self, root: 'Node') -> List[int]:
        return self.helper(root, [])
    
    def helper(self, node, res):
        if not node:
            return res
        if node.children:
            for i in node.children:
                self.helper(i, res)
        res.append(node.val)
        return res

层序遍历

102. 二叉树的层序遍历

  • 一层一层遍历
  • 当前这一层的节点在cur中,遍历cur,把下一层的所有节点append到nex中,把当前这一层所有节点的val作为一个数组append到结果集中,再把下一层要遍历的所有节点的数组赋给当前节点的数组
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        res = []
        cur = [root]
        while cur:
            tmp = []
            nex = []
            for i in cur:
                tmp.append(i.val)
                if i.left:
                    nex.append(i.left)
                if i.right:
                    nex.append(i.right)
            cur = nex
            res.append(tmp)
        return res

429. N叉树的层序遍历

  • 和二叉树的层序遍历一样,只不过N叉树节点的children是一个list
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if not root:
            return []
        res = []
        cur = [root]
        while cur:
            tmp = []
            nex = []
            for i in cur:
                tmp.append(i.val)
                if i.children:
                    nex += i.children
            cur = nex
            res.append(tmp)
        return res

相关文章

网友评论

      本文标题:【Leetcode】树的遍历(前、中、后、层序)

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