给出二叉树。修改它的方式是修改后你可以只用右指针对它进行前序遍历。在修改过程中,您可以使用右侧和左侧指针。
有人建议采用这种方法吗? 如果我们没有预先订购,那么我们可以将树修改为BST 如果不是预先订购我们有后序遍历,该怎么办?
答案 0 :(得分:1)
这归结为线性化树。预订遍历以父,左子树,右子树的顺序访问节点。如果我们只想使用正确的指针来执行此操作,则左子树必须为空。这个想法是重新安排子树。让右指针指向原始左子树。然后让这个子树的最后一个节点的右指针指向原始右子树。
这是一个想法:
Node* Linearize(Node* root) // returns the subtree's last node
{
//if it's a leaf node
if(root->left == NULL && root->right == NULL)
return root;
//if there is no left subtree
if(root->left == NULL)
return Linearize(root->right);
//if there is no right subtree
if(root->right == NULL)
{
root->right = root->left;
root->left = NULL;
return Linearize(root->right);
}
//both subtrees exist
Node* left = root->left;
Node* right = root->right;
Node* lastOfLeft = Linearize(left);
root->right = left;
root->left = NULL;
lastOfLeft->right = right;
return Linearize(right);
}