先上三种遍历方式的递归版代码:
前序遍历:
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]
二叉树层序遍历:
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
求二叉树的深度:
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