一、原题目
Given a binary tree, return the preorder traversal of its nodes' values.
二、题目大意
给定一个棵树,返回先序遍历结果。
三、作者代码:
作者一:
#思路一 递归遍历
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res=[]
self.dfs(root,res)
return res
def dfs(self,root,res):
if root:#如果根元素存在,就添加
res.append(root.val)
self.dfs(root.left,res)#遍历左子树
self.dfs(root.right,res)#遍历右子树
#思路二 迭代遍历
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
stack,res=[root],[]
while stack:
node=stack.pop()
if node:
res.append(node.val)
stack.append(node.right)#为什么是根右左?
stack.append(node.left)
return res
#先序遍历的顺序是:根左右 ,这里根右左是因为append()依次在列表的末尾添加元素,#而pop()默认每次返回最后一个元素,如果不改变顺序就相当于队列了(先进先出)
作者原文链接:https://leetcode.com/problems/binary-tree-preorder-traversal/discuss/45290/Python-solutions-(recursively-and-iteratively).
作者二:
class Solution(object):
def preorderTraversal(self, root):
res = []
if not root: return res#树为空
frontier = [root]
while frontier:
expand = frontier.pop()
res.append(expand.val)#添加根节点
for child in [expand.right, expand.left]:#左右孩子是否存在 从右到左
if child:#存在,加入frontier
frontier.append(child)
return res
作者原文链接:https://leetcode.com/problems/binary-tree-preorder-traversal/discuss/164646/Python-DFS-Stack
作者三:
#思路一:
class Solution(object):
def preorderTraversal(self, root):
if not root:#考虑特殊情况 一个根节点,或者到达叶子结点
return []
elif not root.left and not root.right:
return [root.val]#返回一个列表
l = self.preorderTraversal(root.left)
r = self.preorderTraversal(root.right)
return [root.val]+l+r#根左右
#思路二:
class Solution(object):
def preorderTraversal(self, root):
if not root:#树为空
return []
res = []
stack = [root]
while stack:
u = stack.pop()
res.append(u.val)
if u.right:#右结点存在 与上面第一个思路有点区别,但是本人理解不了,两者处理的是否有区别?
stack.append(u.right)
if u.left:#左结点存在
stack.append(u.left)
return res
#思路三:
class Solution(object):
def preorderTraversal(self, root):
trav = root
stack = []
res = []
while trav or stack:
if trav:
stack.append(trav)
res.append(trav.val)
trav = trav.left#左树遍历完
else:
u = stack.pop()#弹出一个根结点
trav = u.right#右树遍历
return res
作者原文链接:https://leetcode.com/problems/binary-tree-preorder-traversal/discuss/164175/Python-s
四、知识点:
先序遍历的顺序是:根左右 ,列表中根右左是因为append()依次在列表的末尾添加元素,而pop()默认每次返回最后一个元素,如果不改变顺序就相当于队列了(先进先出)
(这个也是做到后面才理解的)
五、来源
题目连接:https://leetcode.com/problems/binary-tree-preorder-traversal/
座右铭:站在别人的思想上,看见自己的不足,传播错误的经验,愿君不重蹈覆辙。
由于受限于本人经验,难免不足,如有建议,欢迎留言交流。
说明:本人对作者的内容进行了简单排版和总结,想看原版,上面有链接,如果喜欢,请点赞,您的鼓励是本人前进的最好动力。本人的这个分类,就是为了汇聚不同思路,为大家学习提供方便,同时为了以后能够全面的理解这里的代码。(现在有些理解不全面,请见谅)
---------------------
作者:路漫漫,远修兮
来源:优快云
原文:https://blog.youkuaiyun.com/qq_41827968/article/details/88756403
版权声明:本文为博主原创文章,转载请附上博文链接!