我正在嘗試創建一個回傳二叉樹鏡像副本的函式。“鏡像”是指一棵樹,每個左節點都作為右節點,反之亦然。

左邊的被復制成與右邊的相似。這是函式的代碼,定義了二進制節點和我使用的“插入節點”函式:
typedef struct bNode {
int data;
struct bNode *left;
struct bNode *right;
} bNode;
// =============================================================
bNode* reverse_tree (bNode **tree) {
bNode *copy = malloc(sizeof(bNode));
copy->data = (*tree)->data;
if (!((*tree)->right) && !((*tree)->left)){
return copy;
}
copy->left = reverse_tree(&(*tree)->right);
copy->right = reverse_tree(&(*tree)->left);
return copy;
}
// =============================================================
void insert(bNode **tree, int data) {
bNode *temp, *previous, *current;
if (*tree == NULL) {
temp = (bNode *) malloc(sizeof (bNode));
temp->data = data;
temp->left = NULL;
temp->right = NULL;
*tree = temp;
return;
}
if (data < (*tree)->data) {
insert(&(*tree)->left, data);
} else if (data > (*tree)->data) {
insert(&(*tree)->right, data);
}
}
經過一些故障排除后,單層遞回作業正常,但在那之后,指標中斷(即,它們指向記憶體的不可訪問部分),并且程式收到 SIGSEGV 分段錯誤。
為什么我會收到此 SIGSEGV 以及如何避免它?
PS我對指標非常缺乏經驗;我希望它不會太糟糕。
(左邊的被復制到與右邊的相似)
uj5u.com熱心網友回復:
至少該功能reverse_tree有一個錯誤。
此 if 陳述句的子陳述句
if (!((*tree)->right) && !((*tree)->left)){
return copy;
}
當左右兩個指標都是空指標時獲得控制權。
所以這個代碼片段
copy->left = reverse_tree(&(*tree)->right);
copy->right = reverse_tree(&(*tree)->left);
當只有一個指標是空指標時可以獲得控制權。
在這種情況下,在函式 this 陳述句的下一個遞回呼叫中
copy->data = (*tree)->data;
為傳遞的空指標呼叫未定義的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/487722.html
