树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
- ⑴访问结点本身(N)
- ⑵遍历该结点的左子树(L)
- ⑶遍历该结点的右子树(R)
前序遍历(先序遍历):
NLR:先访问根节点–> 访问左子树–> 访问右子树
中序遍历:
LNR:先访问左子树–> 访问根节点–> 访问右子树
后序遍历:
LRN:先访问左子树–> 访问右子树–> 访问根节点
举一个例子:
前序:(F)(BADCEGIH)
中序:(ABCDE)(F)(GHI)
后序:(ACEDB)(HIG)(F)
代码实现:
- 前序遍历
递归:
#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 []
output = [root.val]
output.extend(Solution.preorderTraversal(self, root.left))
output.extend(Solution.preorderTraversal(self, root.right))
return output
迭代:
class Solution(object):
def preorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:return []
else:
out = []
stack = [root]
while stack:
root = stack.pop()
if root.right:stack.append(root.right)
if root.left:stack.append(root.left)
out.append(root.val)
return out
- 中序遍历
递归:
#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 []
output = []
output.extend(Solution.inorderTraversal(self, root.left))
output.append(root.val)
output.extend(Solution.inorderTraversal(self, root.right))
return output
迭代:
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:return []
else:
tree_type = type(root)
stack = [root]
output = []
while stack:
root = stack.pop()
if type(root) != tree_type:
output.append(root)
continue
if root.right:stack.append(root.right)
stack.append(root.val)
if root.left:stack.append(root.left)
return output
- 后序遍历
递归:
#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 []
output = []
output.extend(Solution.postorderTraversal(self, root.left))
output.extend(Solution.postorderTraversal(self, root.right))
output.append(root.val)
return output
迭代:
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:return []
else:
out = []
stack = [root]
tree_type = type(root)
while stack:
root = stack.pop()
if type(root) != tree_type and root:
out.append(root)
continue
stack.append(root.val)
if root.right:stack.append(root.right)
if root.left:stack.append(root.left)
return out