二叉树遍历

遍历方式

1、NLR:前序(Preorder Traversal 亦称(先序遍历))

 访问根结点的操作发生在遍历其左右子树之前。

2、LNR:中序遍历(Inorder Traversal)

访问根结点的操作发生在遍历其左右子树之中(间)。

3、 LRN:后序遍历(Postorder Traversal)

访问根结点的操作发生在遍历其左右子树之后。

4、层序遍历

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

python代码实现

本次代码采用的树是

先序遍历

采用递归的方式来遍历

# 1、先序
def pre_order(node):
    if node is None:
        return
    # 相当于每次都是访问根节点
    print node
    pre_order(node.left)
    pre_order(node.right)

采用迭代的方式,这时候引入一个栈,引入栈的意义在于最后弹出一个时,就访问其右子树

代码如下

# 利用迭代的方式来遍历树,其主要思想就是申请一个栈
def pre_order_iter(root):
    s = []
    node = root
    while True:
        while node:
            print node
            s.append(node)
            node = node.left
        if not s:
            break
        else:
            node = s.pop().right

中序遍历

# 2、中序
def in_order(node):
    if node is None:
        return
    in_order(node.left)
    print node
    in_order(node.right)

后序遍历

# 3、后序
def post_order(node):
    if node is None:
        return
    post_order(node.left)
    post_order(node.right)
    print node

层序遍历

里面有一个队列,将每一次访问的左子树,有字数依次入队。最后出队的结果就是我们的目标结果。

# 4、层序
def level_order(root):
    q = deque([root])
    while q:
        node = q.popleft()
        print node

        if node.left:
            q.append(node.left)
        if node.right:
            q.append(node.right)

完整代码如下

# coding=utf-8
from collections import deque

class TreeNode(object):
    def __init__(self,data=None,left=None,right=None):
        self.data = data
        self.left = left
        self.right = right

    # 这一步是在每次调用某个结点时,自动调用.data的方法
    def __str__(self):
        return str(self.data)

# 方法一
def create_tree():
    A, B, C, D, E, F, G, H, I = [TreeNode(x) for x in 'ABCDEFGHI']
    A.left, A.right = B, C
    B.right = D
    C.left, C.right = E, F
    E.left = G
    F.left,F.right = H, I
    return A


# 遍历有4种遍历方式
# 1、先序
def pre_order(node):
    if node is None:
        return
    # 相当于每次都是访问根节点
    print node
    pre_order(node.left)
    pre_order(node.right)


# 2、中序
def in_order(node):
    if node is None:
        return
    in_order(node.left)
    print node
    in_order(node.right)

# 3、后序
def post_order(node):
    if node is None:
        return
    post_order(node.left)
    post_order(node.right)
    print node
# 4、层序
def level_order(root):
    q = deque([root])
    while q:
        node = q.popleft()
        print node

        if node.left:
            q.append(node.left)
        if node.right:
            q.append(node.right)



# 利用迭代的方式来遍历树,其主要思想就是申请一个栈
def pre_order_iter(root):
    s = []
    node = root
    while True:
        while node:
            print node
            s.append(node)
            node = node.left
        if not s:
            break
        else:
            node = s.pop().right



if __name__ == "__main__":
    root = create_tree()
    # pre_order(root)
    # in_order(root)
    # post_order(root)
    # pre_order_iter(root)
    level_order(root)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值