1. 先序遍历
给定一个二叉树,返回它的 前序 遍历。
题目链接:先序遍历
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
- 递归:
递归形式比较简单,就是写好终止条件即可,上代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def __init__(self):
self.res = []
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return None
self.res.append(root.val)
if root.left:
self.preorderTraversal(root.left)
if root.right:
self.preorderTraversal(root.right)
return self.res
- 非递归:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return []
res = []
stack = []
while root or len(stack) > 0:
while root:
res.append(root.val)
stack.append(root)
root = root.left
if len(stack) > 0:
root = stack.pop()
root = root.right
return res
2. 中序遍历
给定一个二叉树,返回它的 中序 遍历。
题目链接:中序遍历
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
- 递归:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def __init__(self):
self.res = []
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return
if root.left:
self.inorderTraversal(root.left)
self.res.append(root.val)
if root.right:
self.inorderTraversal(root.right)
return self.res
- 非递归:
非递归的思想和先序的代码大同小异,二者可以互相借鉴。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return []
res = []
stack = []
while root or len(stack) > 0:
while root:
stack.append(root)
root = root.left
if len(stack) > 0:
root = stack.pop()
res.append(root.val)
root = root.right
return res
3. 后序遍历
给定一个二叉树,返回它的 后序 遍历。
题目链接:后序遍历
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
- 递归:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def __init__(self):
self.res = []
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return None
if root.left:
self.postorderTraversal(root.left)
if root.right:
self.postorderTraversal(root.right)
self.res.append(root.val)
return self.res
- 非递归:需要多加一个lastNode指针记录上一次访问的节点。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return []
res = []
stack = []
lastNode = None
while root:
stack.append(root)
root = root.left
while len(stack) > 0:
root = stack.pop()
if root.right == None or lastNode == root.right:
res.append(root.val)
lastNode = root
else:
stack.append(root)
root = root.right
while root:
stack.append(root)
root = root.left
return res