【问题标题】:Unordered Binary Tree Traversal无序二叉树遍历
【发布时间】:2015-05-01 18:26:50
【问题描述】:

对于类,我必须创建一个状态对象的二叉树,每个状态对象都包含一个常驻对象的二叉树,用于组织居住在每个状态中的人。我正在尝试在给定的州搜索其最年长的居民;但是,居民是按字母顺序排列在树中的,这对我的搜索毫无帮助。因此,我必须遍历整个居民树,更新保存最老的人的节点,并在树完全遍历后返回它。我有我的代码的第一部分,但我坚持如何编写其余的递归。

状态树的方法:

node <Person*> * findoldest (int obd, node <Person*> * oldest, node <Person*> * n)
{   
    //FINAL WORKING CODE
    if (root == NULL)
        return NULL;

    if (n == NULL)
        return NULL;

    else
    {
        if (n->data->birthday < obd)
        {
            obd = n->data->birthday; 
            oldest = n; 
        }
        node <Person*> * o_left = findoldest(obd, oldest, n->left);
        node <Person*> * o_right = findoldest(obd, oldest, n->right);
        node <Person*> * res;
        if (o_right && o_left)
            if (o_right->data->birthday < o_left->data->birthday)
                res = o_right;
            else
                res = o_left;
        else
            res = (o_right != NULL ? o_right : o_left);
        if (res && oldest)
            if (res->data->birthday < oldest->data->birthday)
                return res;
            else
                return oldest;
        else 
            return ((res != NULL ? res : oldest));
    }
}

然后是公共的“包装器”状态树方法:

node <Person*> * findoldest ()
{   int oldest_bday = root->data->birthday; 
    node <Person*> * oldest_person = root;
    findoldest(oldest_bday, oldest_person, root); 
}

【问题讨论】:

  • 另外,几乎可以预料到您会出现段错误。在取消引用它们之前,你永远不会检查你的指针。在做之前总是检查 o_left 是否不为 NULL:o_left-&gt;data
  • 等一下,结果正常吗?
  • 不。仍然存在段错误。这似乎非常非常复杂,有很多 if/else。哇,我非常困惑。
  • 那我搞砸了。让我再经历一次这个烂摊子。我遇到的问题是无法自己测试。 ://
  • 如果你真的想要,我可以给你所有的代码,但它不仅仅是这一段。我不介意,但你可能会大声笑

标签: c++ tree binary-tree tree-traversal


【解决方案1】:

这是你需要的伪代码:

node <Person*> * findoldest (node <Person*> * n)
{
    if n->right != null :
        right_oldest = findoldest(n->right)

    if n->left != null:
        left_oldest = findoldest(n->left)

    return the node that has max value in (right_oldest.data.birthday, left_oldest.data.birthday, n.data.birthday)

}

【讨论】:

    【解决方案2】:

    基本上,这与您上一篇文章的答案相同。

    right_old = findoldestn(n->right);
    left_old = findoldestn(n->left);
    

    然后找出左/右和当前之间最旧的一个,并返回该值。这可以用

    来实现
    res = (right_old->age > left_old->age ? right_old : left_old);
    finalRet = (res->age > oldest->age ? res : oldest);
    return (finalRet);
    

    或等效的 if 表示法:

        if (right_old->age >left_old->age)
            res = right_old;
        else
            res = left_old;
        if (res->age > oldest->age)
            finalRes = res;
        else
            finalRes = oldest;
    

    仅供参考,我很懒,变量->年龄相当于变量->数据->生日。

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 2020-01-15
      • 2012-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      相关资源
      最近更新 更多