python遍历二叉树_python遍历二叉树

定义二叉树:

classTreeNode:def __init__(self, x):

self.val=x

self.left=None

self.right= None

构建二叉树:

#返回构造的TreeNode根节点

defreConstructBinaryTree(self, pre, tin):if not pre or nottin:returnNone

root= TreeNode(pre[0])#根节点

#判断输入的两个序列是不是匹配

if set(pre) !=set(tin):returnNone

i= tin.index(root.val) #i == 3

root.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i]) #列表:左闭右开

root.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:])return root

BFS:

def BFS(self, root): #宽度优先遍历BFS

array =[]

result=[]if root ==None:returnresult

array.append(root)whilearray:

newNode= array.pop(0) #根结点

result.append(newNode.val)if newNode.left !=None:

array.append(newNode.left)if newNode.right !=None:

array.append(newNode.right)return result

先序遍历:1.递归版本:

defpre_traversal(self):

ret=[]deftraversal(head):if nothead:returnret.append(head.val)

traversal(head.left)

traversal(head.right)

traversal(self.root)return ret

2.非递归版本

#先序打印二叉树(非递归)

defpreOrderTravese(node):

stack=[node]while len(stack) >0:print(node.val)if node.right is notNone:

stack.append(node.right)if node.left is notNone:

stack.append(node.left)

node= stack.pop()

中序遍历:

1.递归版本

defin_traversal(self):

ret=[]deftraversal(head):if nothead:returntraversal(head.left)

ret.append(head.val)

traversal(head.right)

traversal(self.root)return ret

2.非递归版本

#中序打印二叉树(非递归)

definOrderTraverse(node):

stack=[]

pos=nodewhile pos is not None or len(stack) >0:if pos is notNone:

stack.append(pos)

pos=pos.leftelse:

pos=stack.pop()print(pos.val)

pos= pos.right

后序遍历:

1.递归版本

defpost_traversal(self):

ret=[]deftraversal(head):if nothead:returntraversal(head.left)

traversal(head.right)

ret.append(head.val)

traversal(self.root)return ret

2.非递归版本

#后序打印二叉树(非递归)#使用两个栈结构#第一个栈进栈顺序:左节点->右节点->跟节点(?应该是根-左-右?根结点先进栈再出栈,然后左右子节点入栈?)#第一个栈弹出顺序: 跟节点->右节点->左节点(先序遍历栈弹出顺序:跟->左->右)#第二个栈存储为第一个栈的每个弹出依次进栈#最后第二个栈依次出栈

defpostOrderTraverse(node):

stack=[node]

stack2=[]while len(stack) >0:

node=stack.pop()

stack2.append(node)if node.left is notNone:

stack.append(node.left)if node.right is notNone:

stack.append(node.right)while len(stack2) >0:print(stack2.pop().val)

求二叉树最大深度:

#二叉树的最大深度

def bTreeDepth(node):

if node is None:

return 0

print '当前节点',node.data

ldepth = bTreeDepth(node.left)

print ' 节点', node.data,'的左侧深度',ldepth

rdepth = bTreeDepth(node.right)

print ' 节点', node.data,'的右侧深度',rdepth

return max(ldepth, rdepth) + 1

求二叉树节点个数:

#求二叉树节点个数

def treeNodenums(node):

if node is None:

return 0

print "当前节点",node.data

nums = treeNodenums(node.left)

print ' ', node.data, '的左节点数', nums

right = treeNodenums(node.right)

print ' ', node.data, '的右节点数', right

nums = nums + right

print ' ', node.data, '的左右节点总数', nums

return nums + 1 # 返回上一级加上父节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值