Python 双向二叉搜索树?

Python 双向二叉搜索树?,python,python-3.x,algorithm,binary-search-tree,Python,Python 3.x,Algorithm,Binary Search Tree,我曾尝试实现一个BST。到目前为止,它只根据BST属性添加键。左下,右大。虽然我以不同的方式实现了它 我认为BST应该是这样的 我是如何实现我的BST的 问题是这是否是BST的正确实施? 按照我在双面BST中看到的方式,搜索、删除和插入会更容易 import pdb; class Node: def __init__(self, value): self.value=value self.parent=None self.left_chi

我曾尝试实现一个BST。到目前为止,它只根据BST属性添加键。左下,右大。虽然我以不同的方式实现了它

我认为BST应该是这样的

我是如何实现我的BST的

问题是这是否是BST的正确实施? 按照我在双面BST中看到的方式,搜索、删除和插入会更容易

import pdb; 
class Node:
    def __init__(self, value):
        self.value=value
        self.parent=None
        self.left_child=None
        self.right_child=None

class BST:

    def __init__(self,root=None):
        self.root=root

    def add(self,value):
        #pdb.set_trace()
        new_node=Node(value)
        self.tp=self.root                                                   
        if self.root is not None:                                         
                while True:
                    if self.tp.parent is None:
                        break
                    else:
                        self.tp=self.tp.parent
                                                                            #the self.tp varible always is at the first node.
                while True:
                    if new_node.value >= self.tp.value :

                        if self.tp.right_child is None:
                            new_node.parent=self.tp
                            self.tp.right_child=new_node
                            break
                        elif self.tp.right_child is not None:
                            self.tp=self.tp.right_child
                            print("Going Down Right")
                            print(new_node.value)
                    elif new_node.value < self.tp.value :
                        if self.tp.left_child is None:
                            new_node.parent=self.tp
                            self.tp.left_child=new_node
                            break
                        elif self.tp.left_child is not None:
                            self.tp=self.tp.left_child
                            print("Going Down Left")
                            print(new_node.value)
        self.root=new_node



newBST=BST()
newBST.add(9)
newBST.add(10)
newBST.add(2)
newBST.add(15)
newBST.add(14)
newBST.add(1)
newBST.add(3)

编辑:我使用了while循环而不是递归。有人能详细解释一下为什么在这种情况下使用while循环而不是递归是个坏主意吗?

您还没有描述如何使用父指针获得任何东西。一个关心倒带到父节点的算法,将通过爬回调用堆栈来实现


我曾经在那里——在我的数据结构课程中,我用双向指针实现了我的东西。当我们谈到二叉树时,那些指针就不再有用了。正确使用递归取代了跟踪链接返回树的需要。

偶尔使用带有父链接的BST

这样做的好处并不是说这些链接使搜索或更新变得更容易,而实际上它们并不容易,而是可以在任何给定节点之前或之后插入,或者从该节点向前或向后遍历,而无需从根节点进行搜索

使用指向节点的指针来表示树中的位置(而不是完整路径)变得很方便,即使树中包含重复的位置,并且该位置在别处执行更新或删除时仍然有效


在抽象数据类型中,这些属性使得它很容易,例如,提供不被突变无效的迭代器。

如果树是双向的,你认为根节点是什么?通常,根节点是没有父节点的节点,但如果树至少有一条边,则双向边可以没有这样的节点。在我的实现中,根节点的父节点为NULL。叶子也是如此。所有叶子的子元素也是空的。我试图做的是保持父节点与其子节点之间的所有连接都是双向的。虽然我明白你的意思。我认为,在您提到的情况下,数据结构将看起来像一个圆而不是一棵树。我假设顺时针和逆时针方向与BST中的左右方向相似。我对吗?你们添加的是所谓的父指针。这允许一个人通过上下移动找到下一个和上一个项目。而不是从树的顶端开始。它没有增加任何功能。只是改变了一些操作的复杂度,我有点困惑,怎么会增加操作的复杂度。我认为如果需要,可以完全忽略父指针。拥有父链接可以使一些操作更容易,因为您可以更容易地从叶节点向上移动树。但好处也有坏处,因为在树结构发生变化时,您需要添加代码来更新这些链接。簿记工作可能与您在稍微高效的遍历上节省的工作量相似。添加链接不是坏事,只是没有什么好处。正确使用递归可以解决很多问题,但不是所有问题。例如,考虑给定一个节点指针并要求返回父节点。如果没有父指针,您必须遍历树:一个OLOGN操作。对于父指针,它是O1。有了生产代码,我可以向您保证,差异很重要。