• Python之二叉树Binarytree


    二叉树是树的简化版,除根节点之外的所有节点都有一个父节点,任意节点都可以最多有一个左子节点和右子节点。

    二叉树的遍历是非常重要的算法,主要分为深度优先遍历和广度优先遍历。

    其中深度优先遍历按照访问根节点和左右子节点的访问顺序,分为先根遍历(preorder),中根遍历(inorder)和后根遍历(postorder)。

    顾名思义,先根遍历的访问原则是先访问根节点,然后左子节点,右子节点;

    中根遍历的访问原则是先左子节点,然后根节点,最后右子节点;

    后根遍历的访问原则是先左子节点,然后右子节点,最后根节点。

    广度优先遍历(breadthfirst),就是像下面这样,访问完一层再访问下一层,如下:

    闲言少叙,上代码:

    import Queue
    
    class Node:
        def __init__(self,value=None,left=None,right=None):
            self.value=value
            self.left=left
            self.right=right
            
    def preorder_trav(root):
        if root==None:
            return 
        print root.value
        preorder_trav(root.left)
        preorder_trav(root.right)
        
    def inorder_trav(root):
        if root ==None:
            return
        inorder_trav(root.left)
        print root.value
        inorder_trav(root.right)
        
    def postorder_trav(root):
        if root ==None:
            return 
        postorder_trav(root.left)
        postorder_trav(root.right)
        print root.value
    
    def breadthfirst_trav(root):
        # Create a queue and add the root node to it.
        q=Queue.Queue()
        q.put(root)
        # Visit each node in the tree.
        while not q.empty() :
            # Remove the next node from the queue and visit it.
            node = q.get()
            print( node.value )
            # Add the two children to the queue.
            if node.left is not None :
                q.put( node.left )
            if node.right is not None :
                q.put( node.right )
        
        
    if __name__=='__main__':
        root=Node('A',Node('B',Node('D'),Node('E')),Node('C',Node('F'),Node('G'))) 
        print 'preorder_trav:'
        preorder_trav(root)
        print 'inorder_trav:'
        inorder_trav(root)
        print 'postorder_trav:'
        postorder_trav(root)
        print 'breadthfirst_trav:'
        breadthfirst_trav(root)

     二叉树的递归遍历代码看起来很简单,有点像伪代码,但功能很强大,非递归方法实现的就有点复杂了,等我研究明白再分享出来。

  • 相关阅读:
    20款时尚的 WordPress 博客主题【免费下载】
    垂涎欲滴!30个美味的食品类移动应用程序【上篇】
    Skippr – 轻量、快速的 jQuery 幻灯片插件
    Boba.js – 用于 Google 统计分析 JavaScript 库
    长期这么做的后果就是人民劳苦而得不到该有的回报,怎么能不垮
    左值与右值的根本区别在于能否获取内存地址,而能否赋值不是区分的依据
    百度后端C++电话一面
    Web 开发和数据科学家仍是 Python 开发的两大主力
    Consul架构
    去除两端逗号-JS
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/6524698.html
Copyright © 2020-2023  润新知