ノードの定義は次のとおりです。
struct node{
int data;
stuct node * left;
struct node * right;
};
私がやろうとしているのは、祖先ノードを指すすべてのノードをリストすることです。間違った解決策を投稿し、答えからアドバイスを受けた後、私の新しい解決策は次のとおりです。
二分木を再帰的に調べます。現在のノードをノードの配列に追加してから、現在のノードの子が前の祖先ノードのいずれかを指しているかどうかを確認します。
デフォルトのケースは、ノードがNULLの場合です。その場合、関数は戻ります。
それがどのように機能することになっているのか:
ノードを配列に追加します
左の子がNULLかどうかを確認します。
そうでない場合は、子を前の各ノードと比較します。
障害が見つかった場合は、それを報告します。
そうでない場合は、子を引数として関数を呼び出します。
終了するまで繰り返します。(二分木のrhsについても同じです)
質問:
- 配列はノードを格納するのに最適ですか?
- これは機能しますか?for(i = 0; i <sizeof(arrOfNodes)/ sizeof(node); i ++)
- 関数は再帰的であるため、配列と配列インデックスは関数内で初期化できません(または初期化できますか?)。グローバルにする必要がありますか?
- 2つのアレイがある方が良いでしょうか?(1つはLHS用、もう1つはRHS用)
コード:
void findFault(node * root){
if (root == NULL){
return;
}
arrOfNodes[index++] == root; // array of nodes
if (root->left != NULL){
for (i = 0; i < sizeof(arrOfNodes) / sizeof(node); i++){
if (ar[i] == root->left){
printf("%d", root->left);
return;
}
}
findFault(root->left);
} else return;
if (root->right != NULL){
for (i = 0; i < sizeof(ar) / sizeof(node); i++){
if (ar[i] == root->right){
printf("%d", root->right);
return;
}
}
findFault(root->right);
} else return;
}