耽搁了好长时间,今天终于把问题解决了。
之前没有完成 查找父结点的功能 在同学帮助下找到了原因。
首先,是两个我的错误想法,应该是
1.树的一个结点的值为NULL,表示这个节点不存在,或者是一个空节点,没有左、右子树,没有数据,什么都没有
2.两个结点相等,必须是数据、左右子树都一样才可以,只有数据相等是不可以的
之前已经说了,总是找不到父结点,是因为我比较的一直是两个结点是否相等,而不是两个结点的数据相等,这样当然找不到了
这次修改就是把原来的比较结点换成了比较节点的数据,加了一层if来控制一种特殊情况:如果某个结点的左子结点为空,却去让它的左子结点的数据赋给某个变量
原来的代码就不贴了,贴一下更改的寻找父结点的函数:
BinTreeNode* BinTree::Father(BinTreeNode *t, BinTreeNode *p) { //寻找父结点,t为根节点,p为要寻找结点
BinTreeNode *q;
if (t == NULL || p == NULL)return NULL;
//若t为p的父结点,则返回t
if (t->GetLeft() != NULL) //判断特殊情况<span style="display: none; width: 0px; height: 0px;" id="transmark"></span>
if ((t->GetLeft())->GetData() == p->GetData())
return t;
if (t->GetRight() != NULL)
if ((t->GetRight())->GetData() == p->GetData())
return t;
//否则分别在t的左右子树寻找
if ((q = Father(t->GetLeft(), p)) != NULL) return q;
else return Father(t->GetRight(), p);
}
好的,就是这样。