【问题标题】:How to recursively print parents of leaves?如何递归打印叶子的父母?
【发布时间】:2021-12-14 04:14:19
【问题描述】:

我需要打印出所有带有叶子的父节点(叶子没有子节点并且高度为 0)作为它们的子节点之一。我让它遍历第一面并用一片叶子返回第一个父级,但是在返回之后,我不确定该怎么做,因为我尝试从右侧向下走,现在我得到一个段错误,我想如果它遍历一个节点的两侧然后它最终会回到那个节点并卡住。

我有什么:

void BST::printLeafParent(Tnode* cur){
    if(getHeight(cur->right)== 0) {
            cout << cur->key;
            if(getHeight(cur->left) ==0)
                    return;
            else{
                    printLeafParent(cur->left);
            }
    }
    printLeafParent(cur->right);
    if(getHeight(cur->left) == 0){
            cout << cur->key;
            return;
    }
    else{
            printLeafParent(cur->left);
    }
}

void BST::printLeafParent(){
    if(getHeight(root->right)== 0) {
            cout << root->key;
            if(getHeight(root->left) ==0)
                    return;
            else
                    printLeafParent(root->left);
    }
    printLeafParent(root->right);
    if(getHeight(root->left) == 0){
            cout << root->key;
            return;
    }
    else{
            printLeafParent(root->left);
    }
}

我觉得我只是错过了一些简单的东西,但我很难理解/找到它。

【问题讨论】:

  • 我没有看到任何针对 NULL 指针的测试。您应该使用调试器并在发生段错误后检查调用堆栈。这将通知您是否有 NULL 指针访问权限或其他情况(例如堆栈溢出)。
  • “我现在得到一个段错误” -- 在哪一行?那时你的变量的值是多少? (调试器使这部分调试更容易。)如果您使用更简单的输入,也许会更容易调试,也许是您当前示例的以he 为根的子树?

标签: c++ recursion avl-tree


【解决方案1】:

根据示例输出,树遍历为:

  1. 处理右子树
  2. 检查父节点的“当前节点”
  3. 处理左子树

这是重写后的样子。

bool BST::isLeaf(Tnode* node)
{
  if (node != nullptr && node->left == nullptr && node->right == nullptr) {
    return true;
  }
  return false;
}

void BST::printLeafParent(Tnode* node)
{
  if (node == nullptr) {
    return;
  }

  printLeafParent(node->right);

  if (isLeaf(node->left) || isLeaf(node->right)) {
    std::cout << node->key << ' ';
  }

  printLeafParent(node->left);

}

void BST::printLeafParent()
{
  printLeafParent(root);
}

【讨论】:

  • “保持递归简单”有点含糊。你能解释一下你做了什么来改进代码吗?从长远来看,依靠代码来解释一切的答案往往没有用处。
  • 您确实编辑了答案。但是,您没有对您的更改添加任何解释,因此我的批评仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多