先上三种遍历方式的递归版代码:
前序遍历:
ans=[]
def PreOrder_Recursive(root):
if root:
ans.append(root.val)
PreOrder_Recursive(root.left)
PreOrder_Recursive(root.right)
中序遍历:
ans=[]
def MidOrder_Recursive(root):
if root:
MidOrder_Recursive(root.left)
ans.append(root.val)
MidOrder_Recursive(root.right)
后续遍历:
ans=[]
def PostOrder_Recursive(root):
if root:
PostOrder_Recursive(root.left)
PostOrder_Recursive(root.right)
ans.append(root.val)
前序遍历非递归版:
思路:利用一个栈来保存遍历过的结点。先一直遍历每一个结点的左孩子。直到左孩子为空时,再退回去找右孩子。
def PreOrder_noRecursive(root):
ans=[]
stack=[]
while root or stack:
while root:
ans.append(root.val)
stack.append(root)
root=root.left
if stack:
top=stack.pop()
root=top.right
return ans
中序遍历非递归版:
def MidOrder(root):
ans=[]
stk=[]
while root or stk:
while root:
stk.append(root)
root=root.left
if stk:
top=stk.pop()
ans.append(top.val)
root=top.right
return ans
后序遍历非递归版:
思路:我们先按照根、右子树、左子树的方式遍历整棵树,然后反向输出遍历结果即可。代码如下:
def PostOrder(root):
ans=[]
stack=[]
while root or stack:
while root:
ans.append(root.val)
stack.append(root)
root=root.right
if stack:
top=stack.pop()
root=top.left
return ans[::-1]
二叉树层序遍历:
1.利用两个队列:
class Solution(object):
def levelOrder(self, root):
if not root:
return []
q1=[]
q2=[]
ans=[]
q1.append(root)
while q1 or q2:
temp1,temp2=[],[]
while q1:
top=q1.pop(0)
if top.left:
q2.append(top.left)
if top.right:
q2.append(top.right)
temp1.append(top.val)
if temp1:
ans.append(temp1)
while q2:
temp=[]
top=q2.pop(0)
if top.left:
q1.append(top.left)
if top.right:
q1.append(top.right)
temp2.append(top.val)
if temp2:
ans.append(temp2)
return ans
2.利用一个队列:
def LayerOrder(root):
queue=[]
ans=[]
queue.append(root)
while queue:
root=queue.pop(0)
ans.append(root.val)
if root.left:
queue.append(root.left)
if root.right:
queue.append(root.right)
return ans
3.更简洁的写法:
class Solution(object):
def levelOrder(self, root):
ans,level=[],[root]
while root and level:
ans.append([n.val for n in level])
level=[kid for n in level for kid in [n.left,n.right] if kid]
return ans
求二叉树的深度:
def TreeDepth(root):
if not root:
return 0
leftDepth=TreeDepth(root.left)
rightDepth=TreeDepth(root.right)
return max(leftDepth,rightDepth)+1
求二叉树结点个数:
def TreeNodeNUmber(root):
if not root:
return 0
num=TreeNodeNUmber(root.left)
num+=TreeNodeNUmber(root.right)
return num+1
二叉树的镜像
递归版:
def MirrorTree_recursive(root):
if not root:
return root
root.left,root.right=root.right,root.left
if root.left:
MirrorTree_recursive(root.left)
if root.right:
MirrorTree_recursive(root.right)
非递归版:
def MirrorTree_norecursive(root):
queue=[]
queue.append(root)
dummy=root
while queue:
root=queue.pop(0)
root.left,root.right=root.right,root.left
if root.left:
queue.append(root.left)
if root.right:
queue.append(root.right)
return dummy