难度:简单
题目要求:给定一个 N 叉树,返回其节点值的前序遍历。
例如:给定一个 3叉树
,返回其前序遍历: [1,3,5,6,2,4]:
代码:(使用递归法)
"""
# Definition for a Node.
class Node(object):
def __init__(self, val=None, children=None):
self.val = val
self.children = children
"""
class Solution(object):
def preorder(self, root):
"""
:type root: Node
:rtype: List[int]
"""
pre_list = []
def traversal(root):
if root != None:
pre_list.append(root.val)
for child in root.children: #依次递归遍历孩子结点
traversal(child)
traversal(root)
return pre_list
总结:我这个是用递归法做的,但是一开始也没做出来,因为关于m叉树的知识点缺少。后来查到m叉树的结点类,有值、孩子两个属性,孩子是一个列表类型。
后来又做了一遍非递归,代码如下:
class Solution(object):
def preorder(self, root):
"""
:type root: Node
:rtype: List[int]
"""
pre_list = [] #存储该树的前序遍历
cur_list = [] #存储未被遍历的结点
if root!=None: #根节点不为空才能进行后续操作②
pre_list.append(root.val) #先将根节点的值存储进去
cur_list = cur_list + root.children[::-1] #将根节点的孩子结点逆序存进栈里:使用切片来逆序①
while len(cur_list)!=0: #只要栈不为空,处理每个子树
# 栈顶元素出栈,并存进pre_list
cur_node = cur_list.pop()
if cur_node!=None:
pre_list.append(cur_node.val)
#将此结点的孩子结点入栈
cur_list = cur_list + cur_node.children[::-1]
return pre_list #返回结果
总结:
列表的反转可以用切片,这个知识点经常遗忘,导致自己写了很多代码,还报错;
在编写代码的时候应该考虑多种情况下的处理,比如根节点为空时才能进行遍历;
优化:extend() 函数用于在列表末尾一次性追加另一个序列中的多个值,可以在列表相加时使用。