RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1426471
Accepted
Сергей
Сергей
Asked:2022-09-04 16:55:30 +0000 UTC2022-09-04 16:55:30 +0000 UTC 2022-09-04 16:55:30 +0000 UTC

树的 OOP - 它是正确的应用程序吗?

  • 772

我正在研究张开树,我决定使用一篇带有正面评价的文章以及来自 habr 的分析和代码:https ://habr.com/ru/company/JetBrains-education/blog/210296/

在文章中,顶点是由一个类来描述的,并没有对代码如何处理多个顶点进行注释。可能是我的实践知识不足以理解创建类元素的过程(我学过OOP,但没有在实践中使用,函数式的方法就够了)。

因此,为了让代码正常工作,我引入了一个列表li,其中我将类实例一个一个放置(一个实例 - 一个顶点),整个树的重建只是通过更改指向孩子和父母的指针,我不对列表进行排序本身。当然,我不得不重写列表下的整个代码(我的部分代码如下)。

问题:我做了正确的事情吗,或者代码可以不改变,但是对于顶点,有必要做一些不同的事情——更多的 OOP 或更高效?

文章中的示例代码(带引号),文章中的所有代码都按照评论中的要求在下面给出:

“要描述树的结构,我们需要一个描述单个顶点的简单类,”

class Node:
  def __init__(self, key, left = None, right = None, parent = None):
    self.left   = left
    self.right  = right
    self.parent = parent
    self.key    = key

“以及两个用于处理指向父母的指针的辅助程序。”

def set_parent(child, parent):
  if child != None:
    child.parent = parent

def keep_parent(v):
  set_parent(v.left, v)
  set_parent(v.right, v)

和插入过程:

def insert(root, key):
  left, right = split(root, key)
  root = Node(key, left, right)
  keep_parent(root)
  return root

我对应的一段代码带了一个列表(类我就不重复了,描述方式和文章一样,我不引用函数调用来减少题量):

def set_parent(child, parent):
    if child != None:
        # Изменение относительно исходного кода
        li[child].parent = parent  

def keep_parent(v):
    # Изменения относительно исходного кода 
    set_parent(li[v].left, v)  
    set_parent(li[v].right, v) 

def insert(root, key):
    left, right = split(root, key)
    # Изменение относительно исходного кода 
    li[root] = Node(key, left, right)
    keep_parent(root)
    return root

# Объявление списка
li = []
n = input()
for _ in range (n): 
    number = input () 
    # Добавление в список вершины
    li.append(Node(number)) 

来自文章https://habr.com/ru/company/JetBrains-education/blog/210296/的完整代码:

class Node:
  def __init__(self, key, left = None, right = None, parent = None):
    self.left   = left
    self.right  = right
    self.parent = parent
    self.key    = key

def set_parent(child, parent):
  if child != None:
    child.parent = parent

def keep_parent(v):
  set_parent(v.left, v)
  set_parent(v.right, v)

def rotate(parent, child):
  gparent = parent.parent
  if gparent != None:
    if gparent.left == parent:
      gparent.left = child
    else:
      gparent.right = child

  if parent.left == child:
    parent.left, child.right = child.right, parent
  else:
    parent.right, child.left = child.left, parent

  keep_parent(child)
  keep_parent(parent)
  child.parent = gparent

def splay(v):
  if v.parent == None:
    return v
  parent = v.parent
  gparent = parent.parent
  if gparent == None:
    rotate(parent, v) 
    return v    
  else:
    zigzig = (gparent.left == parent) == (parent.left == v)
    if zigzig:
      rotate(gparent, parent)
      rotate(parent, v)
    else:
      rotate(parent, v)
      rotate(gparent, v)
    return splay(v)

def find(v, key):
  if v == None:
    return None
  if key == v.key:
    return splay(v)
  if key < v.key and v.left != None:
    return find(v.left, key)
  if key > v.key and v.right != None:
    return find(v.right, key)
  return splay(v)

def split(root, key):
  if root == None:
    return None, None
  root = find(root, key)
  if root.key == key:
    set_parent(root.left, None)
    set_parent(root.right, None)
    return root.left, root.right
  if root.key < key:
    right, root.right = root.right, None
    set_parent(right, None)
    return root, right
  else:
    left, root.left = root.left, None
    set_parent(left, None)
    return left, root 

def insert(root, key):
  left, right = split(root, key)
  root = Node(key, left, right)
  keep_parent(root)
  return root

def merge(left, right):
  if right == None:
    return left
  if left == None:
    return right
  right = find(right, left.key)
  right.left, left.parent = left, right
  return right

def remove(root, key):
  root = find(root, key)
  set_parent(root.left, None)
  set_parent(root.right, None)
  return merge(root.left, root.right)
алгоритм python
  • 1 1 个回答
  • 78 Views

1 个回答

  • Voted
  1. Best Answer
    Сергей
    2022-09-05T03:38:57Z2022-09-05T03:38:57Z

    感谢 Roman 的评论(下文引用),很明显我误解了代码如何组织树元素的存储。

    问题的答案:我做错了,代码必须保持不变才能存储树的元素。

    简而言之,文章代码创建的所有元素都是没有名称的对象,代码本身通过放置在这些对象中的指针来查找这些对象。部分为此,使用了类。

    "insert创建一个新的根节点并向其添加现有树的片段。要使用树(并且只有两个操作:insert- 添加新元素和find- 搜索元素),您需要有一个指向根的链接节点,是她被输入输入,什么在insert,什么在。find剩余的节点可以通过链从根访问left,例如,在搜索时,决定在树中移动的位置(即从哪个子树当前节点)向右或向左。rightfind

    树的工作如下所示:

    首先树是空的:tree = None

    添加第一个元素: tree = insert(tree, 3),

    等等: tree = insert(tree, value_to_insert)

    那些。在tree使用树的客户端中,它存储了到树根的链接,它不应该存储其他顶点。修改操作总是返回一个新的树根,客户端必须保存并在将来使用”

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5