修改二叉树

时间:2014-07-20 10:25:13

标签: c algorithm data-structures tree

给出二叉树。修改它的方式是修改后你可以只用右指针对它进行前序遍历。在修改过程中,您可以使用右侧和左侧指针。

有人建议采用这种方法吗? 如果我们没有预先订购,那么我们可以将树修改为BST 如果不是预先订购我们有后序遍历,该怎么办?

1 个答案:

答案 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);
}