Depth-First
深度遍历是最常见的场景,本质上也是进行模式匹配
二叉树的深度遍历,方便进行直观理解
思路与其他遍历一样,先解决Atomic特例,再遍历
; racket draw Binary Tree
#lang racket
; 导入绘图工具类
(require pict pict/tree-layout)
; 判断Token是否是单个元素
(define (atom? x) (not (or (pair? x) (null? x))))
; 定义一个名为gen-ast,入参为exp的函数
(define gen-ast
(λ (exp)
(match exp
[(? atom? leaf) ;如果为叶子
(tree-layout #:pict (text (~v leaf)))]
[`(,op,l,r) ;对S表达式进行遍历
(let ([v1 (gen-ast l)]
[v2 (gen-ast r)])
(tree-layout #:pict (text (~v op)) v1 v2))])))
; 将生成的 tree-layout 赋值到 tree 变量
(define tree (gen-ast `(+ 1 (+ (* 2 5) (/ 2 4)))))
; 执行绘图
(naive-layered tree)
生成的结果是这样的