如何从最高到最低输出BST的节点值?

How to output the nodes' values of a BST from highest to lowest?

本文关键字:BST 节点 输出      更新时间:2023-10-16
这是一个

我认为很容易的问题,但我发现我错了。我可以在没有递归的情况下完成程序,但我想问这个问题是否可以在递归版本中完成?

递归二叉搜索树遍历基本上是(伪代码,如果这是课程作业):

def traverse (node):
    if (node == NULL):
        return
    traverse (node.left)
    doSomethingWith (node.payload)
    traverse (node.right)
:
traverse (root)

这就是它的全部内容,只需将doSomethingWith()替换为您想要执行的操作(例如打印)。

这将按从左到右的顺序遍历,因此,如果您的 BST 以左表示较低的方式排序,只需交换两个traverse调用即可。

例如,考虑以下树:

       20
      /  
    10    25
   /     /  
  5    24    27
 /          /
2         28

如此示例 C 程序所示:

#include <stdio.h>
typedef struct s {
    int payload;
    int left;
    int right;
} tNode;
tNode node[] = {  // Trust me, this is the tree from above :-)
    {20,  1,  4}, {10,  2, -1}, { 5,  3, -1}, { 2, -1, -1},
    {25,  5,  6}, {24, -1, -1}, {27, -1,  7}, {28, -1, -1}};
static void traverse (int idx) {
    if (idx == -1) return;
    traverse (node[idx].right);
    printf ("%d ", node[idx].payload);
    traverse (node[idx].left);
}
int main (void) {
    traverse (0);
    putchar ('n');
    return 0;
}

运行该程序将产生以下输出:

28 27 25 24 20 10 5 2

当然。假设BST的排序使得"大于"节点在右侧,"小于"节点在左侧,像这样的递归函数将起作用:

void recurse(Node* node)
{
    if (node == nullptr) return;
    recurse(node->right); // Explore all the "greater than" nodes first
    std::cout << node->value << std::endl; // Then print the value
    recurse(node->left); // Then explore "less than" nodes
}