[英]Find the parent node of a node in binary search tree
所以我想在二叉樹中找到一個節點的父節點。 假設我通過文本文件在樹中輸入 30,15,17,45,69,80,7 。
樹應該是
30
15 45
7 17 69
80
這是我的代碼:
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);
}
在這種情況下,我不考慮用戶是否輸入 Root 節點的值。
事情是,當我輸入 15,17,7 時,Root 節點左分支中的所有值,結果都沒有問題。 但是當我想從右分支 (69,80) 中找到值的父節點時,除了 45,程序停止運行。
知道是什么導致了這個錯誤嗎? 謝謝閱讀。
看起來45
沒有left
節點,它是NULL
,因此檢查pRoot->pleft->value == value
是未定義的行為。
30
/ \
15 45
/ \ \
7 17 69
\
80
所以你需要做一個檢查,比如:
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);
}
但是,要檢查的另一件事是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);
}
你的問題是:
if(pRoot->pleft->value == value || pRoot->pright->value == value)
因為在您檢查 left AND right 是否為空之前。 在上面提到的部分中,一個可能為空
你可能想把你的代碼改成這樣:
Node* BST::searchforparentnode(Node* pRoot, int value)
{
if(pRoot->pleft == NULL && pRoot->pright == NULL)
return NULL;
//Added check
if(pRoot->pleft && pRoot->pleft->value == value)
return pRoot;
//Added check
if(pRoot->pright && pRoot->pright->value == value)
return pRoot;
//Check also needed here
if(pRoot->pleft && pRoot->value > value)
return searchforparentnode(pRoot->pleft,value);
//Check also needed here
if(pRoot->pright && pRoot->value < value)
return searchforparentnode(pRoot->pright,value);
}
恕我直言:您還可以在每個節點中創建一個指向父節點的指針。 這可以大大加快某些事情!
public Node nodeParent(Node root, Node n){
if(root==null){
return null;
}
Node p=root;
if(p.left==null && p.right==null ){
return null;
}
if(p.left!=null && p.key>n.key){
p=p.left;
if(p.left.key==n.key){
return p;
}
}
if(p.right!=null && p.key<n.key){
p=p.right;
if(p.right.key==n.key){
return p;
}
}
if(p.left!=null && p.right!=null ){
if(p.key<n.key){
p=p.right;
}else{
p=p.left;
}
}
return p;
}
以下代碼片段應該可以解決問題:
public Node parent(Node root, int childValue){
if(root == null)
return null;
Node left = root.left;
Node right = root.right;
if(left != null && left.value == childValue)
return root;
else if(right != null && right.value == childValue)
return root;
else if(left != null && left.value > childValue)
return parent(left, childValue);
else if(right != null && right.value < childValue)
return parent(right, childValue);
else
return null;
}
您還可以編寫此子程序的簡單迭代版本,如下所示:
public Node parent(Node root, int childValue){
Node parent = NULL;
while(root != NULL && root.value != childValue) {
parent=root;
if(root.value > childValue)
root = root.left;
else
root=root.right;
}
return parent
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.