Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >维护二叉树中的列表顺序

维护二叉树中的列表顺序
EN

Stack Overflow用户
提问于 2011-02-16 23:17:00
回答 3查看 894关注 0票数 3

给定一个数字序列,我希望将这些数字插入到平衡二叉树中,这样当我在树上执行顺序遍历时,它会返回该序列。

如何构造与此需求相对应的插入方法?

请记住,树必须是平衡的,所以没有一个完全平凡的解决方案。我试着用AVL树的一个修改版本来做这件事,但我不确定这是否能成功。

我也希望能够实现一个删除操作。Delete应删除列表中第i个位置的项。

编辑:澄清:

我希望有: Insert(i,e),它在序列中的第i个元素之前插入一个元素e。Delete(i),它删除序列的第i个元素。

如果我插入(0,5),插入(0,4),插入(0,7),那么我存储的序列现在是7,4,5,二叉树上的顺序遍历应该得到7,4,5。

如果我删除了(1),那么在二叉树上的顺序遍历应该会得到7,5。如你所见,在这种情况下,删除了i=1的第i个序列元素后,序列顺序保持不变(因为我已经从0开始对我的序列进行了索引)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-18 12:08:16

这可以使用AVL树来完成。

通过添加到树的最右侧节点,将项目添加到AVL树。

由于旋转的性质,AVL平衡不会影响顺序遍历属性。

在每个节点上存储树的大小,并在插入/删除/平衡期间为每个受影响的节点维护这些值,可以在O(log )时间内完成。在每个节点上存储树的大小允许在序列中按排名搜索项目,因为树中项目的排名是由节点的左子节点的大小+ 1知道的。

从AVL树中删除可以通过将删除的节点替换为该节点的右子树的最左边的节点来完成。

然后,插入和删除操作在O(log )时间内完成,因为树始终是平衡的,并且节点上的大小更新是沿着从插入/删除节点到根的路径进行的。

由于除了二叉树之外不存在后备数据结构,因此可以执行受益于树的其他操作,例如在O(log )时间内找到序列中m,n范围的元素的和。

票数 1
EN

Stack Overflow用户

发布于 2011-02-16 23:22:03

在树中保留一个链表。多亏了树,你已经有了指向节点的指针/引用。当您插入到树中时,还要在链表的末尾插入。从树中删除时,请从链接列表中删除。因为您有引用,所以它们都是O(1)操作,如果您愿意,可以按插入顺序迭代。

编辑:为了澄清Bart的顾虑,这里有一个Java实现

代码语言:javascript
运行
AI代码解释
复制
class LinkedTreeNode<E> {
   E data;
   LinkedTreeNode<E> parent;
   LinkedTreeNode<E> left;
   LinkedTreeNode<E> right;
   LinkedTreeNode<E> insertNext;
   LinkedTreeNode<E> insertPrev;
}

class LinkedTree<E> {
    LinkedTreeNode<E> root;
    LinkedTreeNode<E> insertHead;
    LinkedTreeNode<E> insertTail;

    // skip some stuff
    void add(E e) {
        LinkedTreeNode<E> node = new LinkedTreeNode<E>(e);

        // perform the tree insert using whatever method you like

        // update the list
        node.insertNext = insertTail;
        node.insertPrev = insertTail.insertPrev.insertPrev;
        node.insertPrev.insertNext = node;
        insertTail.insertPrev = node;
    }

    E remove(E e) {
        LinkedTreeNode<E> rem = // whatever method to remove the node
        rem.insertNext.insertPrev = rem.insertPrev;
        rem.insertPrev.insertNext = rem.insertNext;
        return rem.data;
    }
} 
票数 1
EN

Stack Overflow用户

发布于 2011-02-17 01:10:35

如果你可以随机访问序列的内容(例如,你有一个数组),那么你可以直接构建树,这样预排序遍历就可以提供你想要的序列。它实际上可以在没有随机访问的情况下完成,但效率较低,因为可能需要线性扫描来找到序列的中点。

这里的关键观察是,序列中的第一个值位于树的根中,然后序列的其余部分可以分为两部分。前半部分将进入以左子节点为根的子树,后半部分将进入以右子节点为根的子树。因为您在每个步骤中将剩余的列表一分为二,所以生成的树将具有log_2 n个级别,并且将是平衡的。

下面是一些C++代码。请注意," end“指的是当前数组段末尾之后的元素的索引。

代码语言:javascript
运行
AI代码解释
复制
struct Node {
    Node(int v) : value(v), l(0), r(0) {}

    int value;
    Node* l;
    Node* r;
};

Node* vector_to_tree(int begin, int end, int array[]) {
    if (begin == end)
        return NULL;

    Node* root = new Node(array[begin++]);
    int mid = (begin + end) / 2;
    root->l = vector_to_tree(begin, mid, array);
    root->r = vector_to_tree(mid,   end, array);

    return root;
}

void preorder_traverse(Node* root) {
    if (!root)
        return;

    std::cout << root->value << std::endl;
    traverse(root->l);
    traverse(root->r);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5023395

复制
相关文章
python 列表有没有顺序_python的list顺序详解
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
IT工作者
2022/08/04
1.3K0
LeetCode-1367-二叉树中的列表
如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。
benym
2022/07/14
1940
[数据结构]二叉树的顺序存储结构
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
IT编程爱好者
2023/04/12
4180
[数据结构]二叉树的顺序存储结构
Solidity 优化 - 如何维护排序列表
本文我们探索和讨论在以太坊独特的 EVM 成本模型下编写高效的 Solidity 代码的数据结构和实现技术。读者应该已经对 Solidity 中的编码以及 EVM 的总体工作方式所有了解。
Tiny熊
2020/11/03
1.4K0
Solidity 优化 - 如何维护排序列表
数组实现顺序存储二叉树
顺序存储二叉树 顺序存储二叉树只考虑完全二叉树 第 n 个元素的左子节点为 2 * n +1 第 n 个元素的右子节点为 2 * n +2 第 n 个元素的父子节点为 (n-1)/2 n 表示二叉树中第几个元素 代码实现 package xmht.datastructuresandalgorithms.datastructure.tree; /** * @author shengjk1 * @date 2020/5/30 */ public class ArrBinaryTreeDemo { p
shengjk1
2020/05/31
8490
python中的列表
列表是由一系列特定顺序排列的元素组成。你可以创建包含字母表中所有字母,数字0~9或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。鉴于列表通常包含多个元素,给列表指定一个表示复数的名称(如letters、digits或names)是个不错的主意。
狼啸风云
2019/01/28
5.7K0
Python中的列表
列表 是一种用于保存一系列有序项目的集合,也就是说,你可以利用列表保存一串项目的序 列。想象起来也不难,你可以想象你有一张购物清单,上面列出了需要购买的商品,除开在 购物清单上你可能为每件物品都单独列一行,在 Python 中你需要在它们之间多加上一个逗 号。
benym
2022/07/14
5.1K0
Python中的列表
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。 1.列表 数组:存储同一种数据类型的集合 scores = [12,23,45] 列表(打了激素的数组):可以存储任意数据类型
py3study
2020/01/10
5.3K0
css中padding中样式的顺序含义
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116576.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
1.2K0
翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。 由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。 还是以上面的输入为例子。翻转“I am a student.”中所有字符得到“.tn
猿人谷
2018/01/17
1.7K0
Python中的顺序表介绍
在 Python 中,列表是一种基本的数据类型,列表的数据组成了一个序列,序列里的数据是有序的(索引),可以快速地找到指定的数据。
Python碎片公众号
2021/02/26
1.4K0
Python中的顺序表介绍
Windows 窗体中的事件顺序
对于依次处理其中每个事件的开发人员,Windows 窗体应用程序中引发事件的顺序非常具有吸引力。 当出现需要谨慎处理事件的情况时(例如,在重绘窗体的某些部件时),有必要了解运行时引发事件的确切顺序。 本主题提供了应用程序和控件的生存期中几个重要阶段中的事件顺序的详细信息。 有关鼠标输入事件的顺序的特定详细信息,请参阅Windows 窗体中的鼠标事件。Windows 窗体中的事件的概述,请参阅事件概述。 有关事件处理程序的构成的详细信息,请参阅事件处理程序概述。
CNXY
2019/05/24
1.3K0
[剑指offer] 按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
尾尾部落
2018/09/04
3930
按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
MickyInvQ
2021/12/07
4570
按之字形顺序打印二叉树
两个栈来实现; 定义一个放奇数层得栈,一个方偶数层得栈,和一个层奇偶标志, 遍历两个栈,每次消灭一个栈中得数据,添加在list中添加一层得数据 需要注意得是结合栈得先进后出性质,当我们遍历到奇数层时候,我们要从左到右得添加数据到栈二.同理偶数相反.
名字是乱打的
2022/12/13
2820
python中列表排序,字典排序,列表中的字典排序
key= lambda dict1:dict1[0] #dict1[0]表示按键,dict1[1]表示按值。
用户8346838
2021/03/10
9.3K0
一日一学:返回排序好的列表的索引顺序
今天介绍的是对列表排序后,返回排序好的索引顺序。 问题描述:给定一个列表 [2, 3, 1, 4, 5] ,怎么返回排序后的索引顺序,即 [2,0,1,3,4] ? 解决方法: 方案1: 利用 so
kbsc13
2020/02/26
1.1K0
Python中列表的操作
注意事项:列表中所有的增删改操作都是直接改原内存地址,并不需要通过重新赋值;元组属于特殊的列表(只读列表),除了增删改操作,其他列表支持的操作元组都支持。
py3study
2020/01/17
3.5K0
访问列表中的值
#!/usr/bin/python list1 = ['physics', 'chemistry', 1997, 2000] list2 = [1, 2, 3, 4, 5, 6, 7 ] print "list1[0]: ", list1[0] print "list2[1:5]: ", list2[1:5]
用户8442333
2021/05/27
5.8K0
Python中的列表(1)
  所以说访问列表的元素,可以在列表名后加方括号,方括号内输入索引,即可访问对应索引的元素。(ps:索引从0开始)
py3study
2020/01/16
3.4K0

相似问题

维护查询列表的顺序

111

维护Ul Li列表的顺序

58

设置和维护顺序的列表

32

如何在Postgres中维护列表顺序?

211

Angular按顺序维护指令列表

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文