Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中查找并删除BST中的错误节点_C_Algorithm_Pointers_Data Structures_Binary Search Tree - Fatal编程技术网

在C中查找并删除BST中的错误节点

在C中查找并删除BST中的错误节点,c,algorithm,pointers,data-structures,binary-search-tree,C,Algorithm,Pointers,Data Structures,Binary Search Tree,我有一个C问题,我需要检查给定的树是否是二叉搜索树,然后找出哪个节点不正确并将其删除(从问题定义中,它总是一个错误的节点)。例如: 10 | | 9 12 | | | | 7 3 11 14 在此树中,元素3不正确,应删除。若给定的树已经是BST,则算法不应执行任何操作。我正在尝试修改CodeForgeks的解决方案,该解决方案验证树是否为BST,而不是返回布尔值,返回错误节点

我有一个C问题,我需要检查给定的树是否是二叉搜索树,然后找出哪个节点不正确并将其删除(从问题定义中,它总是一个错误的节点)。例如:

       10
       |
       |
 9          12
 |          |
 |          |
7  3       11  14
在此树中,元素3不正确,应删除。若给定的树已经是BST,则算法不应执行任何操作。我正在尝试修改CodeForgeks的解决方案,该解决方案验证树是否为BST,而不是返回布尔值,返回错误节点的指针,但这不起作用。下面是我想出的方法:

NODE* verifyBinaryTree(NODE* root, NO** previous){
    if(node != NULL){
        NODE* left= verifyBinaryTree(root->left, previous);
        if(left != NULL){
            return left;
        }

        if(*previous && root->data <= (*previous)->data) return root;

        *previous = root;

        return(verifyBinaryTree(root->right, previous));
    }
    return NULL;
}

NODE*verifyBinaryTree(NODE*root,NO**previous){
如果(节点!=NULL){
NODE*left=verifyBinaryTree(根->左,上一个);
if(左!=NULL){
左转;
}
if(*上一个&&root->data data data)返回root;
*上一个=根;
返回(verifyBinaryTree(root->right,previous));
}
返回NULL;
}

如果有人能帮我找到这个问题背后的正确逻辑,我将不胜感激。

这里有一个解决这个问题的简单方法。如果在有效的BST上执行顺序遍历,则将以递增顺序对节点进行排序


您可以在顺序遍历中执行此操作,并在将它们串行存储在数据结构(可能是数组)中后,检查相邻元素是否不是按升序进行的。如果你发现了这样的元素,你需要删除它们。

我认为这个函数需要一个
maxValue
和一个
minValue
来检查。任何时候代码跟随左分支,都需要更新
maxValue
。跟随右分支更新
minValue
。此方法存在问题。从原始帖子中考虑树,结果链表从顺序遍历将是:7 9 3 3 10 11 12 14,很容易识别3作为错误节点。但是现在想想原始树,但是3是错误的元素,7是错误的(假设7是16)。由此产生的链接列表将是:16 9 15 20 22 24 26。在这种情况下,我如何识别错误的元素16而不是9?我认为这取决于你对错误的定义。在你的帖子中,你从来没有定义为错误的节点,只是根据它的父节点:你可以认为他们中的任何一个都错了。