打印二叉搜索树的所有叶节点

Print all leaf nodes of a Binary Search Tree

我试图按升序打印所有叶节点,但输出结果与我预期的不同。
插入函数:

Node *insert(Node **root, int k)
{
    if(*root == NULL)
    {
        Node *newNode = (Node *)malloc(sizeof(Node ));
        if(newNode == NULL)
            return NULL;
        newNode->key = k;
        newNode->left = NULL;
        newNode->right = NULL;
        (*root) = newNode; 
        return newNode; 
    }
    if(k < (*root)->key)
        return insert(&((*root)->left),k);
    else
        return insert((&(*root)->right),k);
}

升序打印功能:

void printLeafs(Node *r)
{
    if (r != NULL)
    {
        if(r->right == NULL && r->left == NULL)
           printf("%d ", r->key);
        printLeafs(r->right);       
        printLeafs(r->left);
        
    }
}

示例:
输入:1 2 3 4 5 6 7 8 9
正确输出:4 7 8 9
我的输出:9

其他示例:

在这棵树中我的代码应该打印:
4 6 7 9 10
有什么想法吗?

因为

,你只留下了 pribnt 叶子
if(r->right == NULL && r->left == NULL)

对于非常特殊的输入 1 2 3 4 5 6 7 8 9 你只有一片叶子,即 9.

因此您的代码正在执行“打印二叉树的所有叶节点”,并在 leaf 节点上施加压力。

但是如果你想要 所有 个节点:

要解决此问题,您不应跳过 non-leaf 节点中的值,而是将其打印在正确的位置:

printLeafs(r->right);       
printf("%d ", r->key);
printLeafs(r->left);

为了获得乐趣和洞察力,请对未更改的代码尝试不同的输入: 5 4 6 2 1 3 8 7 9

注意:我承认我忽略了所需的输出,因为它既不匹配“所有叶子”也不匹配“所有”。我的回答符合(回顾)假设你有一个 copy-paste 错误并且所需的输出是 1 2 3 4 5 6 7 8 9.