树的 遍历大类分成 [深度优先]和[广度优先]
其中 [深度优先] 又分为最常用的:前序遍历,中序遍历,后序遍历。
前序遍历:(根左右)
前序遍历可以简单记成“根左右”,就是先遍历根结点,再按深度遍历根的左、右结点。如上图所示。
class TreeNode(): #树结点
def __init__(self,x):
self.val = x
self.left = None
self.right = None
def preorder(root): #前序遍历
if root == None:return
print(root.val)
if root.left:
preorder(root.left)
if root.right:
preorder(root.right)
def createTree(): #创建树
node = TreeNode(1)
leftNode = TreeNode(2)
rightNode = TreeNode(3)
node.left = leftNode
node.right = rightNode
return node
tree = createTree()
preorder(tree) #1 2 3
时间复杂度:O(N),因为每个结点都被无重复地遍历了一次。
空间复杂度:O(h),h为树高,因为在往下遍历时,栈都会保存当前结点的所有祖先结点。
中序遍历:(左根右)
中序遍历可以简单记成“左根右”,就是先遍历根的左结点,再遍历根结点和根的右结点。如上图所示。
class TreeNode(): #树结点
def __init__(self,x):
self.val = x
self.left = None
self.right = None
def midorder(root): #中序遍历
if root == None:return
if root.left:
midorder(root.left)
print(root.val)
if root.right:
midorder(root.right)
def createTree(): #创建树
node = TreeNode(1)
leftNode = TreeNode(2)
rightNode = TreeNode(3)
node.left = leftNode
node.right = rightNode
return node
tree = createTree()
midorder(tree) #2 1 3
时间复杂度:O(N),因为每个结点都被无重复地遍历了一次。
空间复杂度:O(h),h为树高,因为在往下遍历时,栈都会保存当前结点的所有祖先结点。
后序遍历:(左右根)
后序遍历可以简单记成“左右根”,就是先遍历根的左结点、右结点,再遍历根结点。如上图所示。
class TreeNode(): #树结点
def __init__(self,x):
self.val = x
self.left = None
self.right = None
def endorder(root): #后序遍历
if root == None:return
if root.left:
endorder(root.left)
if root.right:
endorder(root.right)
print(root.val)
def createTree(): #创建树
node = TreeNode(1)
leftNode = TreeNode(2)
rightNode = TreeNode(3)
node.left = leftNode
node.right = rightNode
return node
tree = createTree()
endorder(tree) #2 3 1
时间复杂度:O(N),因为每个结点都被无重复地遍历了一次。
空间复杂度:O(h),h为树高,因为在往下遍历时,栈都会保存当前结点的所有祖先结点。
结论:其实可以看出,深度优先遍历的三种(前序、中序、后序)遍历都是时间复杂度为O(N),空间复杂度为O(h)
-------------------------------------------------------------
广度优先遍历:
广度优先遍历也叫层次遍历,就是按顺序一层层地打印结点。如上图所示。
class TreeNode(): #树结点
def __init__(self,x):
self.val = x
self.left = None
self.right = None
def graorder(root):
if root == None:return
queue = [root]
while queue:
res=[]
for item in queue:
print(item.val)
if item.left:
res.append(item.left)
if item.right:
res.append(item.right)
queue = res
def createTree(): #创建树
node = TreeNode(1)
leftNode = TreeNode(2)
rightNode = TreeNode(3)
node.left = leftNode
node.right = rightNode
return node
tree = createTree()
graorder(tree) #2 3 1
时间复杂度都是O(N),因为它们只访问每个节点一次,不存在多余的访问。
空间复杂度是O(w),w是树每一层的最大宽度(拥有最多节点的层的节点数),因为层次遍历通常是用一个queue来实现的。