在C中查找并删除BST中的错误节点
我有一个C问题,我需要检查给定的树是否是二叉搜索树,然后找出哪个节点不正确并将其删除(从问题定义中,它总是一个错误的节点)。例如:在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,而不是返回布尔值,返回错误节点
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?我认为这取决于你对错误的定义。在你的帖子中,你从来没有定义为错误的节点,只是根据它的父节点:你可以认为他们中的任何一个都错了。