博客
关于我
二叉树 简单实现 问题解决
阅读量:331 次
发布时间:2019-03-04

本文共 1097 字,大约阅读时间需要 3 分钟。

今天终于解决了一个长时间耽搁的问题:查找父结点的功能。之前的困难主要源于两个错误的想法,最终在同学的帮助下找到了原因并加以修正。

问题分析

  • 错误想法一:结点值为NULL的意义

    在之前的理解中,我误以为树的一个结点值为NULL表示该节点不存在,或者是一个空节点,没有左、右子树,也没有数据。这种理解本身并没有问题。但是,后来我发现,这种理解导致了另一个错误。

  • 错误想法二:结点比较的逻辑

    在寻找父结点的过程中,我一直使用的是比较两个结点是否相等(即 == 运算符)。这种比较方式是错误的。正确的逻辑应该是先比较两个结点的数据是否相等,再判断是否是同一个节点。简单来说,只有数据相等并不足以说明是同一个结点。

  • 问题根源

    由于上述两个错误,我之前在寻找父结点时总是找不到正确的结点。原因在于,每次比较的结点都只是比较它们是否相等,而不是先比较数据是否相等。这样会导致即使两个结点的数据相等,但如果它们不是同一个节点,仍然无法找到正确的父结点。

    解决方案

    这次修改的核心是对比值的逻辑进行修正。具体来说,我在函数中增加了一层条件判断:

  • 特殊情况处理

    如果某个结点的左子结点为空,但左子结点的数据赋值给某个变量,则继续比较。这一步是为了处理一些特殊情况。

  • 修改后的寻找父结点函数

    更新后的函数逻辑如下:

    BinTreeNode* BinTree::Father(BinTreeNode *t, BinTreeNode *p) {    BinTreeNode *q;    if (t == NULL || p == NULL)        return NULL;    if (t->GetLeft() != NULL) {        if ((t->GetLeft())->GetData() == p->GetData())            return t;    }    if (t->GetRight() != NULL) {        if ((t->GetRight())->GetData() == p->GetData())            return t;    }    if ((q = Father(t->GetLeft(), p)) != NULL)        return q;    else        return Father(t->GetRight(), p);}
  • 优化后的内容

    修改后的函数将比较节点的数据而非结点本身,并增加了对特殊情况的处理。这种方式可以有效解决问题,确保能够正确找到父结点。

    通过上述修改,问题得以解决。

    转载地址:http://rrje.baihongyu.com/

    你可能感兴趣的文章
    Spring源码:initApplicationEventMulticaster源码解析
    查看>>
    AcWing 786: 第k个数
    查看>>
    AcWing 798. 差分矩阵
    查看>>
    AcWing 828. 模拟栈
    查看>>
    AcWing 845. 八数码(BFS)
    查看>>
    AcWing 849. Dijkstra求最短路 I(Dijkstra)
    查看>>
    AcWing 4. 多重背包问题(带有个数限制的完全背包问题dp)
    查看>>
    EventBus简单Demo实现
    查看>>
    添加Selinux权限
    查看>>
    ifconfig网络配置信息解析
    查看>>
    (2019.9.10测试可用)如何在Windows的cmd中使用ls命令
    查看>>
    多因子策略中的IC、IR是什么,以及如何计算
    查看>>
    pd.resample('B')指重采样为工作日
    查看>>
    债券中的久期是什么意思
    查看>>
    MA、WMA、EMA、EXPMA区别及公式详述
    查看>>
    国内量化交易现状总结
    查看>>
    阿里云云解析DNS各种概念深度剖析
    查看>>
    (20200328已解决)从docker容器内复制文件到宿主机
    查看>>
    理解Docker ulimit参数
    查看>>
    Factor Exposure因子暴露
    查看>>