V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ltoddy
V2EX  ›  Python

今天再分享一段代码( Python 二叉树遍历)

  •  
  •   ltoddy ·
    ltoddy · 2018-10-07 07:42:14 +08:00 · 5517 次点击
    这是一个创建于 2243 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    
    def traversal(node):
        if node:
            yield from traversal(node.left)
            yield node.val
            yield from traversal(node.right)
    

    其实也是最近几个月在每天都刷一两道 leetcode 题目.

    https://github.com/ltoddy/leetcode

    第 1 条附言  ·  2018-10-07 16:45:40 +08:00

    后来某某某给我了段新的代码.

    data Tree a
            = Branch a (Tree a) (Tree a)
            | Tip
    
    treeToList :: Tree a -> [a]
    treeToList Tip = []
    treeToList (Branch x l r) = treeToList l ++ [x] ++ treeToList r
    
    31 条回复    2018-10-08 18:30:36 +08:00
    Perry
        1
    Perry  
       2018-10-07 08:04:24 +08:00 via iPhone
    就一个最基础的 inorder traversal 需要分享吗...
    ltoddy
        2
    ltoddy  
    OP
       2018-10-07 08:18:09 +08:00
    @Perry 可是,如果是你写个遍历,会这么简洁的写出来吗?
    mysticzt123
        3
    mysticzt123  
       2018-10-07 08:20:06 +08:00
    这是 leetcode 上别人的答案吧 去年刷题的时候好像见过
    ltoddy
        4
    ltoddy  
    OP
       2018-10-07 08:26:27 +08:00
    @mysticzt123 那看来有共鸣了.(窃喜
    bucky
        5
    bucky  
       2018-10-07 08:31:17 +08:00
    中序,递归,yield
    qile1
        6
    qile1  
       2018-10-07 08:47:16 +08:00 via Android
    看不懂,上面那个类是干啥的,好像没有引用
    lhx2008
        7
    lhx2008  
       2018-10-07 08:49:27 +08:00 via Android
    不过是语法糖而已。。排序直接 sort 不也美哉
    AnyISalIn
        8
    AnyISalIn  
       2018-10-07 08:52:39 +08:00
    就是递归啊。生成器的语法糖而已
    ltoddy
        9
    ltoddy  
    OP
       2018-10-07 09:05:02 +08:00 via Android
    @lhx2008 按你的说法应该用 bisect 吧。
    ltoddy
        10
    ltoddy  
    OP
       2018-10-07 09:05:45 +08:00
    @lhx2008 按你的说法,应该是用 bisect 把?
    Raisu
        11
    Raisu  
       2018-10-07 10:27:12 +08:00 via Android
    。。。。这
    Mitt
        12
    Mitt  
       2018-10-07 10:30:06 +08:00 via iPhone   ❤️ 1
    这也需要拿出来分享,你是在黑 pythoner 吗
    ltoddy
        13
    ltoddy  
    OP
       2018-10-07 10:41:54 +08:00
    @Mitt 还好 Python 程序员叫 pythonista.
    sww4718168
        14
    sww4718168  
       2018-10-07 10:58:27 +08:00
    `yield from` 真是让我们省了好多好多代码。
    carlclone
        15
    carlclone  
       2018-10-07 11:38:10 +08:00
    ....
    zpxshl
        16
    zpxshl  
       2018-10-07 11:56:05 +08:00 via Android
    ........
    d18
        17
    d18  
       2018-10-07 14:36:38 +08:00
    楼主不是计算机专业吧,这是数据结构基础了。
    sudoz
        18
    sudoz  
       2018-10-07 14:58:05 +08:00
    @ltoddy 你所谓的『简洁』不是算法的简洁,只是 Python 语法额外赠送的『简洁』
    mathzhaoliang
        19
    mathzhaoliang  
       2018-10-07 15:08:44 +08:00
    @Mitt 楼主的本意是推销 repo ... 等广告打够了就要放公众号和打赏二维码了 ...
    d18
        20
    d18  
       2018-10-07 15:16:59 +08:00
    我错了,原来楼主你是来推销自己的 GitHub 的
    plantom03
        21
    plantom03  
       2018-10-07 15:23:43 +08:00 via iPhone
    ...
    20015jjw
        22
    20015jjw  
       2018-10-07 15:23:46 +08:00 via Android
    这种秀操作的挺好
    只是在实际操作 /面试的时候 100%没人这么写 写了也得改 iterative
    pricelessLucky
        23
    pricelessLucky  
       2018-10-07 16:06:30 +08:00
    ……???
    yanzixuan
        24
    yanzixuan  
       2018-10-07 16:07:20 +08:00
    写不了这个,因为我还在用 2.7。手动斜眼
    Mitt
        25
    Mitt  
       2018-10-07 20:19:16 +08:00 via iPhone
    @ltoddy .... 别把 你还没搞清楚 python pythonista pythoner 的区别么
    zhangZMZ
        26
    zhangZMZ  
       2018-10-07 20:32:37 +08:00
    如果用平 php 的话,一个函数搞定?
    getToTrees($data);

    世界上最美的语言===PHP




























    我这么说可以你不能说,因为我是 PHPER
    哈哈
    zhangZMZ
        27
    zhangZMZ  
       2018-10-07 20:35:41 +08:00
    话说 python 不也是内部封的函数调用吗?手动滑稽
    webdisk
        28
    webdisk  
       2018-10-07 21:41:34 +08:00
    这种递归的情况, 实际运行时 python 能把它展开么
    JerryCha
        29
    JerryCha  
       2018-10-08 02:13:22 +08:00
    有没有 C 的呀 (滑稽)
    loqixh
        30
    loqixh  
       2018-10-08 16:55:54 +08:00
    我有一个问题, 为什么可以这么? 明显 traversal 和 node.val 类型不一样啊?
    从对应 c#代码可以看出
    ''
    class TreeNode<T>
    {
    public T val;
    public TreeNode<T> left;
    public TreeNode<T> right;
    public TreeNode(T val)
    {
    this.val = val;
    }


    public IEnumerable<T> traversal()
    {
    foreach (var val in left.traversal())
    {
    yield return val;
    }

    yield return val;

    foreach (var val in right.traversal())
    {
    yield return val;
    }
    }
    }
    ''
    ltoddy
        31
    ltoddy  
    OP
       2018-10-08 18:30:36 +08:00 via Android
    @loqixh 可迭代与迭代器不同,迭代器可迭代,但是可迭代不一定就是迭代器。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:21 · PVG 18:21 · LAX 02:21 · JFK 05:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.