当前位置: 首页 > 知识库问答 >
问题:

如何将二叉查找树转移到递增顺序搜索?

长孙沈义
2023-03-14

这是来自leetcode的问题。它说

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

例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;

那就行了。我不明白为什么这两条线那么关键。请解释一下。

共有1个答案

湛铭
2023-03-14

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

  • 首先,它以有序的方式遍历树
  • 其次,它将被访问的节点附加到当前节点的右侧节点,并使左侧节点禁用(将其赋值为空)

现在,下面的代码片段完成了树中最重要的部分:

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

它正在标记树的边界。首先,假设你没有标记你的边界(不使用上面的代码片段),你总是在树中,换句话说,你不是从树中出来的。

不过,我可以假设,您没有发布树的数据结构,在赋值时,left和right child没有设置为NULL。

 类似资料:
  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我正在研究一种寻找阳极父级的方法。我从根部开始,然后沿着叶子往下走,只要它们不是空的,不是孩子的节点。 下面是我的代码,它有点乱,因为我试着测试它看看哪里出了问题。

  • //执行顺序遍历的递归方法

  • 我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个

  • 我有一个<code>BinarySearchTree</code>,里面有Instance bankaccount的对象,这是我创建的一个类,所以基本上它只是一个二进制搜索树,我编写了一个方法,它将获取树并对其进行平衡,因为某些原因,它在平衡之前准确地打印出树: 现在,首先我有方法,它接受一个列表和一个并通过按顺序检查树数据来创建树数据的,因此它是一个排序数组。然后使用另一种方法以平衡的方式创建树

  • 编写一个Lisp程序来检查一个二叉树是否是二叉搜索树。 我正在尝试编写一个二进制递归方法,但我是一个初学者,我不知道从这里去哪里。