Hòa*_*Ngô 5 c++ nodes binary-search-tree
所以我想在二叉树中找到一个节点的父节点。假设我通过文本文件在树中输入 30,15,17,45,69,80,7 。
树应该是
30
15 45
7 17 69
80
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
Node* BST::searchforparentnode(Node* pRoot, int value)
{
if(pRoot->pleft == NULL && pRoot->pright == NULL)
return NULL;
if(pRoot->pleft->value == value || pRoot->pright->value == value)
return pRoot;
if(pRoot->value > value)
return searchforparentnode(pRoot->pleft,value);
if(pRoot->value < value)
return searchforparentnode(pRoot->pright,value);
Run Code Online (Sandbox Code Playgroud)
}
在这种情况下,我不考虑用户是否输入 Root 节点的值。
事情是,当我输入 15,17,7,Root 节点左分支中的所有值时,结果没问题。但是当我想从右分支 (69,80) 中找到值的父节点时,除了 45,程序停止运行。
知道是什么导致了这个错误吗?谢谢阅读。
似乎45没有left节点,它是NULL,因此检查pRoot->pleft->value == value是未定义的行为。
30
/ \
15 45
/ \ \
7 17 69
\
80
Run Code Online (Sandbox Code Playgroud)
所以你需要做一个检查,比如:
Node* BST::searchforparentnode(Node* pRoot, int value)
{
if(pRoot->pleft == NULL && pRoot->pright == NULL)
return NULL;
if( (pRoot->pleft != NULL && pRoot->pleft->value == value)
|| (pRoot->pright != NULL && pRoot->pright->value == value))
return pRoot;
if(pRoot->value > value)
return searchforparentnode(pRoot->pleft,value);
if(pRoot->value < value)
return searchforparentnode(pRoot->pright,value);
}
Run Code Online (Sandbox Code Playgroud)
但是,要检查的另一件事是它pRoot本身是否是NULL:
Node* BST::searchforparentnode(Node* pRoot, int value)
{
if (pRoot == NULL)
return NULL;
if(pRoot->pleft == NULL && pRoot->pright == NULL)
return NULL;
if( (pRoot->pleft != NULL && pRoot->pleft->value == value)
|| (pRoot->pright != NULL && pRoot->pright->value == value))
return pRoot;
if(pRoot->value > value)
return searchforparentnode(pRoot->pleft,value);
if(pRoot->value < value)
return searchforparentnode(pRoot->pright,value);
}
Run Code Online (Sandbox Code Playgroud)