对于任一结点。能够按某种次序运行三个操作:

  • 訪问结点本身(N)
  • 遍历该结点的左子树(L)
  • 遍历该结点的右子树(R)

用来表示顺序,即,前序NLR/中序LNR/后序LRN.

以下我们用namedtuple来表达树,而通杀的遍历函数带一个order參数,仅仅要我们把指定顺序传进去就可以实现相应的遍历.

  1. #coding=utf-8
  2. '''
  3. 1
  4. / \
  5. / \
  6. / \
  7. 2 3
  8. / \ /
  9. 4 5 6
  10. / / \
  11. 7 8 9
  12. '''
  13.  
  14. from collections import namedtuple
  15. from sys import stdout
  16.  
  17. Node = namedtuple('Node', ['data','left','right'])
  18. tree = Node(1,
  19. Node(2,
  20. Node(4,
  21. Node(7, None, None),
  22. None),
  23. Node(5, None, None)),
  24. Node(3,
  25. Node(6,
  26. Node(8, None, None),
  27. Node(9, None, None)),
  28. None))
  29.  
  30. def visitor(i):
  31. stdout.write("%i "%i)
  32.  
  33. def traversal(node, order):#这个是主角,通杀函数
  34. if not node:return
  35. op = {
  36. 'N':lambda:visitor(node.data),
  37. 'L':lambda:traversal(node.left, order),
  38. 'R':lambda:traversal(node.right, order),
  39. }
  40. for x in order:
  41. op[x]()
  42.  
  43. for order in ['NLR', 'LNR', 'LRN']:
  44. traversal(tree, order)
  45. print

飘逸的python - 极简的二叉树前中后序通杀函数的更多相关文章

  1. C++二叉树前中后序遍历(递归&非递归)统一代码格式

    统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理. 三种递归格式: 前序遍历: void PreOrder(TreeNode* root, vector<int>&pa ...

  2. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  3. [C++] 非递归实现前中后序遍历二叉树

    目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...

  4. 前中后序递归遍历树的体会 with Python

    前序:跟->左->右 中序:左->根->右 后序:左>右->根 采用递归遍历时,编译器/解释器负责将递归函数调用过程压入栈并保护现场,在不同位置处理根节点即可实现不 ...

  5. Binary Tree Traversal 二叉树的前中后序遍历

    [抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...

  6. POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

    链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...

  7. C++实现对树的创建和前中后序遍历

    #include<iostream>#include<stdio.h> using namespace std; class BitNode{ public: char dat ...

  8. 数据结构-C语言递归实现树的前中后序遍历

    #include <stdio.h> #include <stdlib.h> typedef struct tree { int number ; struct tree *l ...

  9. Qt实现 动态化遍历二叉树(前中后层次遍历)

    binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...

随机推荐

  1. [转]asp.net MVC 常见安全问题及解决方案

    本文转自:http://www.cnblogs.com/Jessy/p/3539564.html asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request ...

  2. 使用Dreamweaver在一张图片上添加多个热点链接

    所有代码: <html> <head> <meta charset="utf-8"> <title>无标题文档</title& ...

  3. 联想 K10(K10e70) 免解锁BL 免rec Magisk Xposed 救砖 ROOT 版本号 S206

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  4. RabbitMQ 创建用户和创建Virtual host

    https://www.bilibili.com/video/av18997807/?p=3 Virtual host 就是类似数据库吧.

  5. Kafka 入门和 Spring Boot 集成

    目录 Kafka 入门和 Spring Boot 集成 标签:博客 概述 应用场景 基本概念 基本结构 和Spring Boot 集成 集成概述 集成环境 kafka 环境搭建 Spring Boot ...

  6. .net core 使用 textSharp生成pdf

    引入Nuget包 using iTextSharp.text; using iTextSharp.text.pdf; using System; using System.IO; namespace ...

  7. ubuntu14.04远程软件VNC的安装、设置方法

    ubuntu中VNCX11開機啟動保持靜默狀態方法: 1首先安裝vncx11. 2.設置vnc密碼,會自動保存在/home/test/.vnc/passwd中 3.將密碼複製到/etc中 4.在/et ...

  8. sql的四种连接方式

    1.内联接.(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students ...

  9. 企业级mysql数据库完全备份、增量备份脚本

    企业完全备份脚本 [root@client ~]# vim /opt/mysql_bak_wanbei.sh #!/bin/bash #MySQL数据库完全备份脚本 #设置登录变量 MY_USER=& ...

  10. kernel中的函数指针

    经常会看到这类的结构体: 这个结构体中 有几个函数指针, 这种方式的好处,可以有多种具体的函数实现,但是,这样就统一了接口 struct address_space_operations { int ...