📅  最后修改于: 2023-12-03 15:10:20.214000             🧑  作者: Mango
给定一颗二叉树,返回其节点值的前序遍历。
示例1:
输入:
1
\
2
/
3
输出:[1, 2, 3]
示例2:
输入:
1
/ \
4 2
/
3
输出:[1, 4, 2, 3]
前序遍历的顺序是:节点 -> 左子树 -> 右子树。
递归实现:
当遇到节点不为空的情况,将其加入遍历序列中,并将左、右子树(在节点不为空的情况下)递归遍历。
迭代实现:
利用栈的特性将节点入栈,每次取出栈顶节点进行遍历,并将其右、左子树(在节点不为空的情况下)分别压进栈中,保证左子树先于右子树入栈,左子树后于右子树出栈。
递归实现:
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
def traversal(node):
if node:
res.append(node.val)
traversal(node.left)
traversal(node.right)
traversal(root)
return res
迭代实现:
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
while root or stack:
while root:
res.append(root.val)
stack.append(root)
root = root.left
root = stack.pop()
root = root.right
return res
递归实现 O(n),每一个节点都需要访问一次。
迭代实现 O(n),每一个节点都需要访问一次。
递归实现 O(n),最坏情况下,树退化成一个链表,栈的空间复杂度为 O(n)。
迭代实现 O(n),最坏情况下,树为左子树退化成一个链表,栈的空间复杂度为 O(n)。