【问题标题】:searching an element in binary tree using in order traversal使用顺序遍历搜索二叉树中的元素
【发布时间】:2018-09-06 14:39:34
【问题描述】:
struct tnode
{
    int val;
    struct tnode *left;
    struct tnode *right;
};

int search(struct tnode *root, int val)
{
    int p = 0;
    int q = 0;
    if (!root) return 0;
    p = search(root->left, val);
    if (p == 1) return 1;
    if (root->val == val) return 1;
    q = search(root->right, val);
    if (q == 1) return 1;
}

当搜索树时找不到val 时,我不明白上述代码如何返回0

【问题讨论】:

  • 将最后两行替换为return q;
  • 获取tour、阅读How to Askminimal reproducible example。没有 MCVE,很难确定问题出在哪里。
  • 是的,这有效,但我想知道为什么上面的代码有效。因为,在某个时间点没有返回值。当 root 变为 null 时,它向被调用函数返回 0 并存储在 p 或 q 中,但它们都不会再次返回。
  • 为什么还要有这样的功能?通常,树搜索函数返回节点或指向它的指针。只要知道它就在那里,您仍然必须搜索它才能对它做任何事情。你所拥有的,是无用的练习。

标签: c search data-structures binary-tree


【解决方案1】:

在这里,我使用堆栈来迭代树的中序遍历。

int find_element(struct node *root,int val){

     if(!root) return 0;
     std::stack<node*> s;
     while(!s.empty() || root){
          if(root){
              s.push(root);
              root=root->left;
          }
          else
          {
              root=s.top();
              s.pop();
              if(root->val==val) return 1;
              root=root->right;
          }
     }
     return 0;
}

【讨论】:

    【解决方案2】:

    你所拥有的是一个非结构化函数。有四个返回语句和五个可能的返回路径。其中一个返回显式返回 0,其他显式返回 1,因此要么您调用 search,而 root 为 NULL,要么第五个隐式返回路径恰好返回零。

    调高编译器的警告级别,它应该标记出并非所有执行路径都返回值的事实。

    我建议你重新安排你的逻辑,使得函数末尾有一个 return 语句。

    【讨论】:

    • 由于这显然是一个家庭作业,我不会为你修复你的代码。
    • 感谢您的信息。我想我应该检查编译器中的警告级别。它通过使用很少的返回语句来工作,但我想知道为什么上面的代码没有抛出“它已经到达没有返回值的函数结尾”的错误
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多