解法一:递归
前序遍历就是这么定义的,不描述了。
class Solution:def preorder(self, root: 'Node') -> List[int]:ans = []def f(root):if root:ans.append(root.val)for child in root.children:f(child)f(root)return ans
解法二:迭代
用一个stack来控制左右孩子的访问顺序。先访问当前节点,然后将其孩子反向压栈。这样可以保证出栈的时候,先访问的是左孩子,在访问左孩子时,左孩子的左孩子又会被压至栈顶部。直至左孩子访问完毕,栈顶会出现第一个最底层的第二左孩子。因此实现了先序遍历。
class Solution:def preorder(self, root: 'Node') -> List[int]:ans, stack = [], [root] if root else []while stack:node = stack.pop()ans.append(node.val)stack.extend(node.children[::-1])return ans
同类题目
144. 二叉树的前序遍历
二叉树的迭代法还可以用以下回溯方法:
先序遍历的顺序是从当前节点开始,遍历至最左叶子,之后回溯。在回溯的过程中如果出现节点有右子树,则对右子树做同样的操作。因此需要两层循环:外层负责判断调用栈是否为空;内层第一个循环将当前节点的全部左孩子按遍历顺序压入调用栈。第二个循环负责回溯,返回调用栈至第一个有右子树的节点。
class Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:ans, stack, cur = [], [root] if root else [], rootwhile stack:# 迭代至最左叶子,并将访问过的节点压栈while cur:stack.append(cur)ans.append(cur.val)cur = cur.left# 回溯至第一个有右子树的节点while stack:cur = stack.pop()if cur.right:break# 将cur指向其右子树,下一次循环时对右子树实施迭代cur = cur.rightreturn ans
该方法如果要改造成N叉树,则需要记录每个节点的children有哪些已经访问过了。
