2040年是什么年| 玛瑙是什么材质| 什么是同房| 治疗腱鞘炎用什么药效果好| 黄油可以做什么美食| 黄辣丁是什么鱼| 减肥可以吃什么零食| 女生肾疼是什么原因| 2016年是属什么年| 经期吃什么好排除瘀血| 唐伯虎是什么生肖| 女人吃什么最好| 血栓吃什么药可以疏通血管| 过敏是什么样的图片| 丑角是什么意思| 痛苦的反义词是什么| 鲁班是什么家| 肛门痒挂什么科检查| 胎动突然频繁是什么原因| 魂牵梦萦的意思是什么| 维生素c不能和什么一起吃| 双向情感障碍是什么病| 补牙是什么意思| 梦见相亲是什么意思| 五行缺木是什么命| 亚人是什么意思| 锦纶是什么| bioisland是什么牌子| 唐宝是什么意思| 氟苯尼考兽药治什么病| 脑供血不足吃什么药好| 大枣和红枣有什么区别| 胚轴发育成什么| 子宫囊肿严重吗有什么危害| 人咬人有什么危害| 什么时间吃苹果最好| 肛瘘是什么病| 牛肉可以炖什么| 肺气阴两虚吃什么中成药| 大蒜吃多了有什么坏处| 桂花是什么生肖| 金牛座前面是什么星座| 87年属什么的生肖| 露酒是什么酒| 未亡人什么意思| 村居是什么意思| 考研复试考什么| 抗炎是什么意思| 双喜临门的临是什么意思| 费神是什么意思| 客观是什么意思| 什么药治高血压效果最好| 葛根粉吃了有什么好处| 疤痕增生是什么引起的| 耄耋读什么| 统考是什么意思| 结节性硬化症是什么病| 做恐怖的梦预示着什么| 小孩经常流鼻血是什么原因| 识大体是什么意思| 小肠气是什么病| 牛杂是牛的什么部位| 冲鼠煞北是什么意思| 日语为什么怎么说| 鉴定是什么意思| 马来西亚说什么语言| 什么的菜地| 枕秃是什么意思| 双离合是什么意思| 甲功不正常有什么表现| 两鬓斑白是什么意思| 什么叫子宫肌瘤| 十万左右买什么车好| 花裙子配什么上衣好看| 严重失眠吃什么药管用| 1月11是什么星座| 牙齿发酸是什么原因| 长期便秘是什么原因引起的| 确认妊娠是什么意思啊| 甘露醇有什么作用| 鱼肝油是什么| 脖子粗是什么原因| 蒙奇奇是什么动物| 身高用什么单位| 窦性心动过缓什么意思| 社保基数什么时候调整| 慢性肠炎吃什么药最好| 心绪是什么意思| 属猴的和什么属相最配| 腰封是什么意思| 咖啡有什么作用和功效| 什么饮料解暑| 洋姜有什么功效与作用| 背德感是什么意思| 圈层是什么意思| 金是什么颜色| 丝光棉是什么面料| 1973年属牛是什么命| 鲸鱼属于什么类动物| 阿司匹林和阿莫西林有什么区别| 吃鸡蛋补什么| 眉头长痘痘是因为什么原因引起的| 前额头疼是什么原因引起的| 高危病变是什么意思| 给朋友送什么礼物好| 什么病人要补氯化钾呢| 前列腺按摩什么感觉| 甲胎蛋白偏低说明什么| 良心是什么| 无名指麻木是什么原因| 更年期出汗吃什么药好| 石斤读什么| 束在什么情况下读su| 射手座跟什么星座最配| 参加白事回来注意什么| 云指什么生肖| 蜜獾为什么什么都不怕| 乳房胀痛是什么原因引起的| 寿诞是什么意思| 梦见洗头发是什么意思| 熬夜对身体有什么危害| 海底捞是什么| 左肾钙化灶什么意思| 宫颈涂片检查是查什么| 回甘是什么意思| 叶黄素对眼睛有什么功效| 吃什么对肝好怎么养肝| 黄鳝吃什么东西长得快| 上海居住证积分有什么用| 一什么蝉| nerdy是什么牌子| 安字属于五行属什么| 百合是什么植物| 日加一笔可以变成什么字| 1月18日什么星座| 土豆淀粉能做什么美食| 梦见菜刀是什么意思| 五台山是求什么的| 水车是什么意思| plcc是什么意思| 八败是什么意思| 梦见自己娶媳妇是什么意思| 馍是什么意思| kids是什么牌子| 盆腔炎吃什么药效果最好| 舌头尖有小红点这是什么症状| 吃黑豆有什么好处和坏处| 气溶胶传播是什么意思| 月色真美什么意思| 什么样的花朵| 补料是什么意思| 10月11日是什么星座| da是什么意思| lp是什么| 蜻蜓喜欢吃什么| 作奸犯科是什么意思| 2月7日什么星座| hr是什么单位| 少许纤维灶是什么意思| 毛囊长什么样子| 黑五是什么时候| 梦见很多坟墓是什么意思| 鬼佬是什么意思| 第二视角是什么意思| 古灵精怪什么意思| 白开水喝多了有什么危害| 5月15日什么星座| edc是什么| 性张力是什么意思| 武则天叫什么名字| 失眠可以吃什么药| sd是什么意思| 有生之年什么意思| 最毒妇人心是什么意思| 叶子为什么是绿色的| 自来水养鱼为什么会死| 手信是什么| 做梦掉牙齿是什么预兆| 西柚是什么季节的水果| 白介素是什么| 胯疼是什么原因| 脂膜炎是什么原因引起的| 用黄瓜敷脸有什么功效| 白喉采取什么隔离| 过渡句的作用是什么| 俄罗斯乌拉是什么意思| 奔走相告的走是什么意思| 青霉素是什么药| 夫妻肺片里面都有什么| 吃什么会拉肚子| 不慎是什么意思| 羊肉不能和什么水果一起吃| 子衿什么意思| cut什么意思| 发际线高的人说明什么| 右腹疼是什么原因| 办身份证要穿什么衣服| 鲐背之年是什么意思| 肚子上面疼是什么原因| 什么叫变态| 病案号是什么意思| 使婢差奴过一生是什么意思| 西瓜和什么不能一起吃| 缺失是什么意思| 办身份证要带什么| 什么是生物制剂| 从什么时候开始| 惠字五行属什么| 五四运动的精神是什么| 早晨起床口苦是什么原因| 坐东朝西是什么意思| 骑驴找马什么意思| c14呼气试验是检查什么的| 纺锤形是什么形状| 肛门松弛吃什么药| 睡醒口干口苦是什么原因| 七月十四是什么节| 骨质密度增高是什么意思| 生理期是什么意思| 神经性耳鸣吃什么药好| 肠易激综合征中医叫什么| 雁过拔毛是什么意思| 高温中暑吃什么药| 做爱什么姿势最舒服| 老有眼屎是什么原因| 滑膜炎吃什么好得快| 生吃西红柿有什么好处和坏处| 排骨炖什么| 做梦梦见狗咬我什么意思啊| 人品好是什么意思| 仁波切是什么意思| 死去活来是什么生肖| 被蚂蚁咬了用什么药| 什么是高热量食物有哪些| 12月11日什么星座| 总胆汁酸高说明什么| 入定是什么意思| 慢性病是什么意思| 孕妇刚生完孩子吃什么好| 中国最高军衔是什么| 搞基是什么意思| levis是什么牌子| 经常饿是什么原因| 什么是一体机| 血滴子是什么| 理想型是什么意思| 什么的身体| 脑梗吃什么中药| 什么汤有营养| 五行属什么怎么看| 吃完饭想吐是什么原因| 松花粉对肝有什么好处| 欲什么意思| 防血栓是什么意思| 做什么业务员好| 不什么不什么的词语| 喝什么水好啊| 213什么星座| 朱元璋为什么杀李善长| cbd是什么| 2050年是什么年| 胆囊疼是什么原因| 尿点什么意思| 中国第一大姓是什么| 百度Jump to content

考作诗考小品 艺术院校校考频现“奇题”选人才

From Wikipedia, the free encyclopedia
百度 甚至有HR爆料,工作几年就可以退休了。

In computer science, tree traversal (also known as tree search and walking the tree) is a form of graph traversal and refers to the process of visiting (e.g. retrieving, updating, or deleting) each node in a tree data structure, exactly once. Such traversals are classified by the order in which the nodes are visited. The following algorithms are described for a binary tree, but they may be generalized to other trees as well.

Types

[edit]

Unlike linked lists, one-dimensional arrays and other linear data structures, which are canonically traversed in linear order, trees may be traversed in multiple ways. They may be traversed in depth-first or breadth-first order. There are three common ways to traverse them in depth-first order: in-order, pre-order and post-order.[1] Beyond these basic traversals, various more complex or hybrid schemes are possible, such as depth-limited searches like iterative deepening depth-first search. The latter, as well as breadth-first search, can also be used to traverse infinite trees, see below.

Data structures for tree traversal

[edit]

Traversing a tree involves iterating over all nodes in some manner. Because from a given node there is more than one possible next node (it is not a linear data structure), then, assuming sequential computation (not parallel), some nodes must be deferred—stored in some way for later visiting. This is often done via a stack (LIFO) or queue (FIFO). As a tree is a self-referential (recursively defined) data structure, traversal can be defined by recursion or, more subtly, corecursion, in a natural and clear fashion; in these cases the deferred nodes are stored implicitly in the call stack.

Depth-first search is easily implemented via a stack, including recursively (via the call stack), while breadth-first search is easily implemented via a queue, including corecursively.[2]:?45?61?

[edit]
Depth-first traversal (dotted path) of a binary tree:
  • Pre-order (node visited at position red ):
        F, B, A, D, C, E, G, I, H;
  • In-order (node visited at position green ):
        A, B, C, D, E, F, G, H, I;
  • Post-order (node visited at position blue ):
        A, C, E, D, B, H, I, G, F.

In depth-first search (DFS), the search tree is deepened as much as possible before going to the next sibling.

To traverse binary trees with depth-first search, perform the following operations at each node:[3][4]

  1. If the current node is empty then return.
  2. Execute the following three operations in a certain order:[5]
    N: Visit the current node.
    L: Recursively traverse the current node's left subtree.
    R: Recursively traverse the current node's right subtree.

The trace of a traversal is called a sequentialisation of the tree. The traversal trace is a list of each visited node. No one sequentialisation according to pre-, in- or post-order describes the underlying tree uniquely. Given a tree with distinct elements, either pre-order or post-order paired with in-order is sufficient to describe the tree uniquely. However, pre-order with post-order leaves some ambiguity in the tree structure.[6]

There are three methods at which position of the traversal relative to the node (in the figure: red, green, or blue) the visit of the node shall take place. The choice of exactly one color determines exactly one visit of a node as described below. Visit at all three colors results in a threefold visit of the same node yielding the “all-order” sequentialisation:

F-B-A-A-A-B-D-C-C-C-D-E-E-E-D-B-F-G-G-?I-H-H-H-?I-?I-G-F

Pre-order, NLR

[edit]
  1. Visit the current node (in the figure: position red).
  2. Recursively traverse the current node's left subtree.
  3. Recursively traverse the current node's right subtree.

The pre-order traversal is a topologically sorted one, because a parent node is processed before any of its child nodes is done.

Post-order, LRN

[edit]
  1. Recursively traverse the current node's left subtree.
  2. Recursively traverse the current node's right subtree.
  3. Visit the current node (in the figure: position blue).

Post-order traversal can be useful to get postfix expression of a binary expression tree.

In-order, LNR

[edit]
  1. Recursively traverse the current node's left subtree.
  2. Visit the current node (in the figure: position green).
  3. Recursively traverse the current node's right subtree.

In a binary search tree ordered such that in each node the key is greater than all keys in its left subtree and less than all keys in its right subtree, in-order traversal retrieves the keys in ascending sorted order.[7]

Reverse pre-order, NRL

[edit]
  1. Visit the current node.
  2. Recursively traverse the current node's right subtree.
  3. Recursively traverse the current node's left subtree.

Reverse post-order, RLN

[edit]
  1. Recursively traverse the current node's right subtree.
  2. Recursively traverse the current node's left subtree.
  3. Visit the current node.

Reverse in-order, RNL

[edit]
  1. Recursively traverse the current node's right subtree.
  2. Visit the current node.
  3. Recursively traverse the current node's left subtree.

In a binary search tree ordered such that in each node the key is greater than all keys in its left subtree and less than all keys in its right subtree, reverse in-order traversal retrieves the keys in descending sorted order.

Arbitrary trees

[edit]

To traverse arbitrary trees (not necessarily binary trees) with depth-first search, perform the following operations at each node:

  1. If the current node is empty then return.
  2. Visit the current node for pre-order traversal.
  3. For each i from 1 to the current node's number of subtrees ? 1, or from the latter to the former for reverse traversal, do:
    1. Recursively traverse the current node's i-th subtree.
    2. Visit the current node for in-order traversal.
  4. Recursively traverse the current node's last subtree.
  5. Visit the current node for post-order traversal.

Depending on the problem at hand, pre-order, post-order, and especially one of the number of subtrees ? 1 in-order operations may be optional. Also, in practice more than one of pre-order, post-order, and in-order operations may be required. For example, when inserting into a ternary tree, a pre-order operation is performed by comparing items. A post-order operation may be needed afterwards to re-balance the tree.

[edit]
Level-order: F, B, G, A, D, I, C, E, H.

In breadth-first search (BFS) or level-order search, the search tree is broadened as much as possible before going to the next depth.

Other types

[edit]

There are also tree traversal algorithms that classify as neither depth-first search nor breadth-first search. One such algorithm is Monte Carlo tree search, which concentrates on analyzing the most promising moves, basing the expansion of the search tree on random sampling of the search space.

Applications

[edit]
Tree representing the arithmetic expression: A * (B ? C) + (D + E)

Pre-order traversal can be used to make a prefix expression (Polish notation) from expression trees: traverse the expression tree pre-orderly. For example, traversing the depicted arithmetic expression in pre-order yields "+ * A ? B C + D E". In prefix notation, there is no need for any parentheses as long as each operator has a fixed number of operands. Pre-order traversal is also used to create a copy of the tree.

Post-order traversal can generate a postfix representation (Reverse Polish notation) of a binary tree. Traversing the depicted arithmetic expression in post-order yields "A B C ? * D E + +"; the latter can easily be transformed into machine code to evaluate the expression by a stack machine. Post-order traversal is also used to delete the tree. Each node is freed after freeing its children.

In-order traversal is very commonly used on binary search trees because it returns values from the underlying set in order, according to the comparator that set up the binary search tree.

Implementations

[edit]

Depth-first search implementation

[edit]

Below are examples of stack-based implementation for pre-order, post-order and in-order traversal in recursive approach (left) as well as iterative approach (right).

Implementations in iterative approach are able to avoid the drawbacks of recursion, particularly limitations of stack space and performance issues.

Several alternative implementations are also mentioned.

Pre-order implementation

[edit]
procedure preorder(node)
    if node = null
        return
    visit(node)
    preorder(node.left)
    preorder(node.right) 
procedure iterativePreorder(node)
    if node = null
        return
    stack ← empty stack
    stack.push(node)
    while not stack.isEmpty()
        node ← stack.pop()
        visit(node)
        // right child is pushed first so that left is processed first
        if node.right ≠ null
            stack.push(node.right)
        if node.left ≠ null
            stack.push(node.left)

Post-order implementation

[edit]
procedure postorder(node)
    if node = null
        return
    postorder(node.left)
    postorder(node.right)
    visit(node)
procedure iterativePostorder(node)
    if node = null
        return
    stack ← empty stack
    lastNodeVisited ← null
    while not stack.isEmpty() or node ≠ null
        if node ≠ null
            stack.push(node)
            node ← node.left
        else
            peekNode ← stack.peek()
            // if right child exists and traversing node
            // from left child, then move right
            if peekNode.right ≠ null and lastNodeVisited ≠ peekNode.right
                node ← peekNode.right
            else
                visit(peekNode)
                lastNodeVisited ← stack.pop()

In-order implementation

[edit]
procedure inorder(node)
    if node = null
        return
    inorder(node.left)
    visit(node)
    inorder(node.right)
procedure iterativeInorder(node)
    if node = null
        return
    stack ← empty stack
    while not stack.isEmpty() or node ≠ null
        if node ≠ null
            stack.push(node)
            node ← node.left
        else
            node ← stack.pop()
            visit(node)
            node ← node.right

Another variant of pre-order

[edit]

If the tree is represented by an array (first index is 0), it is possible to calculate the index of the next element:[8][clarification needed]

procedure bubbleUp(array, i, leaf)
    k ← 1
    i ← (i - 1)/2
    while (leaf + 1) % (k * 2) ≠ k
        i ← (i - 1)/2
        k ← 2 * k
    return i

procedure preorder(array)
    i ← 0
    while i ≠ array.size
        visit(array[i])
        if i = size - 1
            i ← size
        else if i < size/2
            i ← i * 2 + 1
        else
            leaf ← i - size/2
            parent ← bubble_up(array, i, leaf)
            i ← parent * 2 + 2

Advancing to the next or previous node

[edit]

The node to be started with may have been found in the binary search tree bst by means of a standard search function, which is shown here in an implementation without parent pointers, i.e. it uses a stack for holding the ancestor pointers.

procedure search(bst, key)
    // returns a (node, stack)
    node ← bst.root
    stack ← empty stack
    while node ≠ null
        stack.push(node)
        if key = node.key
            return (node, stack)
        if key < node.key
            node ← node.left    
        else
            node ← node.right
    return (null, empty stack)

The function inorderNext[2]:?60? returns an in-order-neighbor of node, either the in-order-successor (for dir=1) or the in-order-predecessor (for dir=0), and the updated stack, so that the binary search tree may be sequentially in-order-traversed and searched in the given direction dir further on.

procedure inorderNext(node, dir, stack)
    newnode ← node.child[dir]
    if newnode ≠ null
        do
            node ← newnode
            stack.push(node)
            newnode ← node.child[1-dir]
        until newnode = null
        return (node, stack)
    // node does not have a dir-child:
    do
        if stack.isEmpty()
            return (null, empty stack)
        oldnode ← node
        node ← stack.pop()   // parent of oldnode
    until oldnode ≠ node.child[dir]
    // now oldnode = node.child[1-dir],
    // i.e. node = ancestor (and predecessor/successor) of original node
    return (node, stack)

Note that the function does not use keys, which means that the sequential structure is completely recorded by the binary search tree’s edges. For traversals without change of direction, the (amortised) average complexity is because a full traversal takes steps for a BST of size 1 step for edge up and 1 for edge down. The worst-case complexity is with as the height of the tree.

All the above implementations require stack space proportional to the height of the tree which is a call stack for the recursive and a parent (ancestor) stack for the iterative ones. In a poorly balanced tree, this can be considerable. With the iterative implementations we can remove the stack requirement by maintaining parent pointers in each node, or by threading the tree (next section).

Morris in-order traversal using threading

[edit]

A binary tree is threaded by making every left child pointer (that would otherwise be null) point to the in-order predecessor of the node (if it exists) and every right child pointer (that would otherwise be null) point to the in-order successor of the node (if it exists).

Advantages:

  1. Avoids recursion, which uses a call stack and consumes memory and time.
  2. The node keeps a record of its parent.

Disadvantages:

  1. The tree is more complex.
  2. We can make only one traversal at a time.
  3. It is more prone to errors when both the children are not present and both values of nodes point to their ancestors.

Morris traversal is an implementation of in-order traversal that uses threading:[9]

  1. Create links to the in-order successor.
  2. Print the data using these links.
  3. Revert the changes to restore original tree.

Breadth-first search

[edit]

Also, listed below is pseudocode for a simple queue based level-order traversal, and will require space proportional to the maximum number of nodes at a given depth. This can be as much as half the total number of nodes. A more space-efficient approach for this type of traversal can be implemented using an iterative deepening depth-first search.

procedure levelorder(node)
    queue ← empty queue
    queue.enqueue(node)
    while not queue.isEmpty()
        node ← queue.dequeue()
        visit(node)
        if node.left ≠ null
            queue.enqueue(node.left)
        if node.right ≠ null
            queue.enqueue(node.right)

If the tree is represented by an array (first index is 0), it is sufficient iterating through all elements:

procedure levelorder(array)
    for i from 0 to array.size
        visit(array[i])

Infinite trees

[edit]

While traversal is usually done for trees with a finite number of nodes (and hence finite depth and finite branching factor) it can also be done for infinite trees. This is of particular interest in functional programming (particularly with lazy evaluation), as infinite data structures can often be easily defined and worked with, though they are not (strictly) evaluated, as this would take infinite time. Some finite trees are too large to represent explicitly, such as the game tree for chess or go, and so it is useful to analyze them as if they were infinite.

A basic requirement for traversal is to visit every node eventually. For infinite trees, simple algorithms often fail this. For example, given a binary tree of infinite depth, a depth-first search will go down one side (by convention the left side) of the tree, never visiting the rest, and indeed an in-order or post-order traversal will never visit any nodes, as it has not reached a leaf (and in fact never will). By contrast, a breadth-first (level-order) traversal will traverse a binary tree of infinite depth without problem, and indeed will traverse any tree with bounded branching factor.

On the other hand, given a tree of depth 2, where the root has infinitely many children, and each of these children has two children, a depth-first search will visit all nodes, as once it exhausts the grandchildren (children of children of one node), it will move on to the next (assuming it is not post-order, in which case it never reaches the root). By contrast, a breadth-first search will never reach the grandchildren, as it seeks to exhaust the children first.

A more sophisticated analysis of running time can be given via infinite ordinal numbers; for example, the breadth-first search of the depth 2 tree above will take ω·2 steps: ω for the first level, and then another ω for the second level.

Thus, simple depth-first or breadth-first searches do not traverse every infinite tree, and are not efficient on very large trees. However, hybrid methods can traverse any (countably) infinite tree, essentially via a diagonal argument ("diagonal"—a combination of vertical and horizontal—corresponds to a combination of depth and breadth).

Concretely, given the infinitely branching tree of infinite depth, label the root (), the children of the root (1), (2), ..., the grandchildren (1, 1), (1, 2), ..., (2, 1), (2, 2), ..., and so on. The nodes are thus in a one-to-one correspondence with finite (possibly empty) sequences of positive numbers, which are countable and can be placed in order first by sum of entries, and then by lexicographic order within a given sum (only finitely many sequences sum to a given value, so all entries are reached—formally there are a finite number of compositions of a given natural number, specifically 2n?1 compositions of n ≥ 1), which gives a traversal. Explicitly:

  1. ()
  2. (1)
  3. (1, 1) (2)
  4. (1, 1, 1) (1, 2) (2, 1) (3)
  5. (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) (4)

etc.

This can be interpreted as mapping the infinite depth binary tree onto this tree and then applying breadth-first search: replace the "down" edges connecting a parent node to its second and later children with "right" edges from the first child to the second child, from the second child to the third child, etc. Thus at each step one can either go down (append a (, 1) to the end) or go right (add one to the last number) (except the root, which is extra and can only go down), which shows the correspondence between the infinite binary tree and the above numbering; the sum of the entries (minus one) corresponds to the distance from the root, which agrees with the 2n?1 nodes at depth n ? 1 in the infinite binary tree (2 corresponds to binary).

References

[edit]
  1. ^ "Lecture 8, Tree Traversal". Retrieved 2 May 2015.
  2. ^ a b Pfaff, Ben (2004). An Introduction to Binary Search Trees and Balanced Trees. Free Software Foundation, Inc.
  3. ^ Binary Tree Traversal Methods
  4. ^ "Preorder Traversal Algorithm". Retrieved 2 May 2015.
  5. ^ L before R means the (standard) counter-clockwise traversal—as in the figure.
    The execution of N before, between, or after L and R determines one of the described methods.
    If the traversal is taken the other way around (clockwise) then the traversal is called reversed. This is described in particular for reverse in-order, when the data are to be retrieved in descending order.
  6. ^ "Algorithms, Which combinations of pre-, post- and in-order sequentialisation are unique?, Computer Science Stack Exchange". Retrieved 2 May 2015.
  7. ^ Wittman, Todd. "Tree Traversal" (PDF). UCLA Math. Archived from the original (PDF) on February 13, 2015. Retrieved January 2, 2016.
  8. ^ "constexpr tree structures". Fekir's Blog. 9 August 2021. Retrieved 2025-08-06.
  9. ^ Morris, Joseph M. (1979). "Traversing binary trees simply and cheaply". Information Processing Letters. 9 (5): 197–200. doi:10.1016/0020-0190(79)90068-1.

Sources

[edit]
  • Dale, Nell. Lilly, Susan D. "Pascal Plus Data Structures". D. C. Heath and Company. Lexington, MA. 1995. Fourth Edition.
  • Drozdek, Adam. "Data Structures and Algorithms in C++". Brook/Cole. Pacific Grove, CA. 2001. Second edition.
  • "Tree Transversal" (math.northwestern.edu)
[edit]
史迪仔是什么动物 看空是什么意思 尿路感染吃什么药效果最好 什么都不想做 肉麻是什么意思
啐了一口是什么意思 下巴上有痣代表什么 毒龙钻是什么 血脂高有什么危害 常温是什么意思
心脏支架后吃什么药 姜黄是什么 腋下长痘痘是什么原因 什么是一线城市 头晕有点恶心是什么原因
眼睛痒什么原因 翡翠和玉石有什么区别 30年的婚姻是什么婚 肺结核是什么原因引起的 亨字五行属什么
超脱是什么意思hcv9jop2ns2r.cn 双鱼座女和什么星座最配dajiketang.com 脚干裂用什么药最好zhongyiyatai.com 机油用什么能洗掉hcv9jop1ns2r.cn 1984年是什么命helloaicloud.com
梦见葡萄是什么意思hcv9jop0ns4r.cn cpu什么意思hcv9jop3ns1r.cn 入伏天是什么意思tiangongnft.com 养寇自重什么意思hcv9jop0ns5r.cn 黄芪有什么作用hcv9jop1ns1r.cn
什么的口水hcv8jop2ns5r.cn 什么花是白色的hcv8jop7ns1r.cn 光是什么颜色hcv9jop5ns7r.cn 家家酒是什么意思hcv9jop2ns0r.cn 白内障的症状是什么bfb118.com
什么app可以买烟520myf.com 吃什么补铁快hcv9jop0ns8r.cn 1980年是什么年hcv9jop4ns3r.cn 社恐的人适合什么工作hcv8jop3ns1r.cn 什么时候立春hcv7jop9ns3r.cn
百度