class AST
{
private:
TreeNode **a;
int capacity;
public:
void deletenode(const int &i);
这是我的AST树类(TreeNode是一个抽象类)。
让我们假装一个[t]是[i]的左孩子,在调用deletenode(i)之后,a [t]及其左边的孩子应该被删除而一个[t]的右边孩子应该成为一个[i]的新左孩子。
我真的很无能,我应该说“这就是我试过的”,但我会说这就是我的想法:
1 - 从[t]的右边孩子(和它的孩子)建立一个新树,然后在[i]的左边插入新树,我有一个功能,可以将树插入树中但是这个是一个非常差,慢的算法。
2 - 考虑一些关系应用于每个节点,以便a [i] = a [f(i)],然后删除[f(i)],但我没有找到任何f(i)和有一些节点不受删除的影响。
我需要的是算法,没有别的,这就像它的名字暗示的是编译器项目,删除对于优化很重要,我需要它基于数组,因为广度优先传递算法更简单它。
Delete operation in Array Binary Tree。但是,它没有回答我的问题,也没有说任何关于轮换的事情。
关于基于数组的二进制树有很多问题,但关于删除和旋转没有。
那么有一个快速的算法吗?谢谢你的帮助。
根是[0]而不是[1]。所以a [i]的左子是[2 * i + 1],右边是[2 * i + 2]。