【问题标题】:How to transfer a binary search tree to an increasing order search?如何将二叉搜索树转换为递增顺序搜索?
【发布时间】:2020-12-24 07:02:13
【问题描述】:

这是来自leetcode 的问题。 它说

给定二叉搜索树的根,重新排列树 有序,使得树中最左边的节点现在是 树,每个节点没有左孩子,只有一个右孩子。

示例 1,

示例 2,

我的代码和下面的差不多,

void inorder(struct TreeNode *root, struct TreeNode **newRoot)
{
    if (root == NULL)
        return;

    inorder(root->left, newRoot);
    (*newRoot)->left = NULL;
    (*newRoot)->right = root;
    *newRoot = (*newRoot)->right;
    inorder(root->right, newRoot);
    return;
}

struct TreeNode* increasingBST(struct TreeNode *root)
{
    struct TreeNode *newRoot = calloc(1, sizeof(struct TreeNode));
    struct TreeNode *result = newRoot;
    inorder(root, &newRoot);
    //newRoot->left = NULL;
    //newRoot->right = NULL;
    return result->right;
}

在输入 [2,1,4,null,null,3] 之前,它适用于多个输入。 实际上,它最终返回了,但我仍然收到“超出时间限制”错误。 我发现有一个类似的解决方案,但它激活了上面的两行,

newRoot->left = NULL;
newRoot->right = NULL;

然后就可以了。 我不明白这两行为什么那么重要。 请对此有所了解。

【问题讨论】:

    标签: tree binary-tree binary-search-tree


    【解决方案1】:

    嗯,你发布的算法一个接一个地做两件事。

    • 首先它以 INORDER 方式遍历树
    • 其次,将访问节点附加到当前节点的右节点,并使左节点禁用(分配为NULL)

    现在下面的代码 sn-p 做你树中最重要的事情:

    newRoot->left = NULL;
    newRoot->right = NULL;
    

    它正在标记树的边界。暂时假设,如果你不标记你的边界(不使用上面的 sn-p),你总是在树中,换句话说,你不是从树中出来的。

    虽然,您没有发布树的数据结构,但我可以假设,在分配值时左右子节点没有设置为 NULL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多