首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

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

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




























    我这么说可以你不能说,因为我是 PHPER
    哈哈
        27
    zhangZMZ   2018-10-07 20:35:41 +08:00
    话说 python 不也是内部封的函数调用吗?手动滑稽
        28
    webdisk   2018-10-07 21:41:34 +08:00
    这种递归的情况, 实际运行时 python 能把它展开么
        29
    JerryCha   2018-10-08 02:13:22 +08:00
    有没有 C 的呀 (滑稽)
        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;
    }
    }
    }
    ''
        31
    ltoddy   2018-10-08 18:30:36 +08:00 via Android
    @loqixh 可迭代与迭代器不同,迭代器可迭代,但是可迭代不一定就是迭代器。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4143 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 06:37 · PVG 14:37 · LAX 22:37 · JFK 01:37
    ♥ Do have faith in what you're doing.