这是节点定义:
struct node{
int data;
stuct node * left;
struct node * right;
};
我要做的是列出所有指向祖先节点的节点。在发布错误的解决方案并从答案中获取建议后,我的新解决方案是:
递归遍历二叉树。将当前节点添加到节点数组中,然后检查当前节点的子节点是否指向任何先前的祖先节点。
默认情况是节点为 NULL。如果发生这种情况,函数将返回。
它应该如何工作:
将节点添加到数组
检查左孩子是否为 NULL。
如果不是,它将子节点与之前的每个节点进行比较。
如果它发现故障,它会报告它。
如果不是,它以子作为参数调用该函数。
重复直到完成。(对于二叉树的 rhs 也一样)
问题:
- 数组是存储节点的最佳方式吗?
- 这行得通吗?for (i = 0; i < sizeof(arrOfNodes) / sizeof(node); i++)
- 因为函数是递归的,所以数组和数组索引不能在函数内部初始化(或者它们可以是?)所以它们应该是全局的吗?
- 有两个数组会更好吗?(LHS 一个,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;
}