2023-12-12 树的前中后各种遍历玩法

树的前中后各种遍历方法

前序遍历、中序遍历、后序遍历是怎么样的!头结点参考它们前,中,后就可以了!
也就是前序遍历,头节点最先遍历,后是左节点,再是有节点!
中序遍历,左叶子节点,头节点结点,再到右节点!
后序遍历,左叶子节点,右叶子节点,再到头结点

第一种递归遍历:

递归遍历三要素:

① 确定递归的参数以及返回值

② 确定终止条件

③ 确定单层递归逻辑

前序:
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        left = self.preorderTraversal(root.left)
        right = self.preorderTraversal(root.right)

        return [root.val] + left +right
    	# 中序
        return left + [root.val] + right
    	# 后序
        return left + right + [root.val] 

第二种统一遍历

那我们就将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。

如何标记呢,就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。 这种方法也可以叫做标记法。

def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        stack = []
        if root:
            stack.append(root)
        while stack:
            node = stack.pop()
            if not node is None:
                if node.right:
                    stack.append(root.right)
                if node.left:
                    stack.append(root.left)
                # 下面这两行移动就上下就是中序、后序遍历了!
                stack.append(node)
                stack.append(None)
            else:
                node = stack.pop()
                result.append(node.val)
        return result

第三种使用栈来遍历的

前序:

中序:

后序:

再来看后序遍历,先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图:

2023-12-12 树的前中后各种遍历玩法_第1张图片

你可能感兴趣的:(数据结构)