You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++二叉树打印叶子节点父节点的实现问题与求助

二叉树叶子节点父节点打印功能实现问题

我的C++练习任务是实现二叉树中叶子节点父节点的打印功能,我提出了两种实现思路:

思路1

/* 编写程序查找并打印二叉树中所有仅拥有叶子节点作为子节点的顶点 */

#include <iostream>

class Node{
  public:
    int data;
    Node* left = nullptr;
    Node* right = nullptr;

    Node(int value){data=value;}
};

bool traverse(Node* node);

bool traverse(Node* node){
  if(!node->left&&!node->right)
    return true;

  if (traverse(node->left)||traverse(node->right)) 
      std::cout<<node->data<<'\t';  

  if(node->left)
    traverse(node->left);

  if (node->right) 
    traverse(node->right);  
}// 非void函数未在所有控制路径中返回值

优点:无需额外变量,Node类简洁,便于在其他树结构中复用类似实现。
缺点:traverse函数存在编译器报错:非void函数未在所有控制路径返回值,不知如何添加return false;且担心破坏递归逻辑。

思路2

/* 编写程序查找并打印二叉树中所有仅拥有叶子节点作为子节点的顶点 */

#include <iostream>

class Node{
  public:
    int data;
    Node* left = nullptr;
    Node* right = nullptr;
    bool isLeaf = false;

    Node(int value){data=value;}
};

void traverse(Node* node);

void traverse(Node* node){
  if(!node->left&&!node->right){
    node->isLeaf = true;
    return;
  }

  if (node->left||node->right) 
      std::cout<<node->data<<'\t';  

  if(node->left)
    traverse(node->left);

  if (node->right) 
    traverse(node->right);  
}

优点:实现更稳妥,逻辑更易把控。
缺点:Node类新增了isLeaf变量,在复杂树类中冗余,结构不够简洁。

问题与求助

  • 两种思路的traverse函数均无法正常递归执行,虽有return语句避免无限循环,但递归调用逻辑存在问题,求指出错误。
  • 希望完善思路1,解决编译器要求添加return false;的问题,同时保留其通过自调用判断叶子父节点的逻辑。

补充说明

附测试用main函数:

int main(){
  Node* root = new Node(1);
  root->left = new Node(2);
  root->right = new Node(3);
  root->left->left = new Node(4);
  root->left->right = new Node (5);
  root->right->left = new Node(6);
  root->right->right = new Node(7);

  traverse(root);
  return 0;
}

更新

经RandomBits指出问题后,代码接近解决方案,但测试时会重复打印叶子节点父节点,对此现象存在疑问。

内容的提问来源于stack exchange,提问作者wavesinaroom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:22:37