कैसे पायथन में एक द्विआधारी खोज वृक्ष लागू करने के लिए?

वोट
25

यह मैं अब तक क्या मिल गया है, लेकिन यह काम नहीं कर रहा है:

class Node:
    rChild,lChild,data = None,None,None

    def __init__(self,key):
        self.rChild = None
        self.lChild = None
        self.data = key

class Tree:
    root,size = None,0
    def __init__(self):
        self.root = None
        self.size = 0

    def insert(self,node,someNumber):
        if node is None:
            node = Node(someNumber)
        else:
            if node.data > someNumber:
                self.insert(node.rchild,someNumber)
            else:
                self.insert(node.rchild, someNumber)
        return

def main():
    t = Tree()
    t.root = Node(4)
    t.root.rchild = Node(5)
    print t.root.data #this works
    print t.root.rchild.data #this works too
    t = Tree()
    t.insert(t.root,4)
    t.insert(t.root,5)
    print t.root.data #this fails
    print t.root.rchild.data #this fails too

if __name__ == '__main__':
     main()
26/03/2011 को 19:37
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


17 जवाब

वोट
5

Op के Tree.insertविधि पुरस्कार "सकल सप्ताह के मिथ्या नाम" के लिए उत्तीर्ण - यह कुछ भी सम्मिलित नहीं है। यह एक नोड जो किसी अन्य नोड के साथ संलग्न नहीं है बनाता है (किसी भी नोड्स देखते हैं नहीं है कि यह करने के लिए संलग्न करने के लिए) और फिर बनाया नोड जब विधि रिटर्न ट्रैश किए गए है।

@Hugh Bothwell की उन्नति के लिए:

>>> class Foo(object):
...    bar = None
...
>>> a = Foo()
>>> b = Foo()
>>> a.bar
>>> a.bar = 42
>>> b.bar
>>> b.bar = 666
>>> a.bar
42
>>> b.bar
666
>>>
26/03/2011 को 19:50
का स्रोत उपयोगकर्ता

वोट
9
class Node: 
    rChild,lChild,data = None,None,None

यह गलत है - यह आपके चर बनाता वर्ग चर - जो है, नोड के प्रत्येक उदाहरण एक ही मूल्यों का उपयोग करता (rChild बदलने की किसी भी नोड सभी नोड्स के लिए यह परिवर्तन!)। यह स्पष्ट रूप से आप क्या नहीं करना चाहता है, प्रयत्न

class Node: 
    def __init__(self, key):
        self.rChild = None
        self.lChild = None
        self.data = key

अब प्रत्येक नोड चर के अपने स्वयं के सेट है। एक ही, ट्री की अपनी परिभाषा पर लागू होता है

class Tree:
    root,size = None,0    # <- lose this line!
    def __init__(self):
        self.root = None
        self.size = 0

इसके अलावा, प्रत्येक वर्ग के एक "नई शैली" "वस्तु" वर्ग से व्युत्पन्न वर्ग होना चाहिए और श्रृंखला वापस आपत्ति उठाने चाहिए .__ init __ ():

class Node(object): 
    def __init__(self, data, rChild=None, lChild=None):
        super(Node,self).__init__()
        self.data   = data
        self.rChild = rChild
        self.lChild = lChild

class Tree(object):
    def __init__(self):
        super(Tree,self).__init__()
        self.root = None
        self.size = 0

इसके अलावा, मुख्य () बहुत दूर इंडेंट है - जैसा दिखाया गया है, यह पेड़ के एक तरीका है जिसके uncallable है, क्योंकि यह एक को स्वीकार नहीं करता है आत्म तर्क।

इसके अलावा, आप वस्तु के डेटा सीधे (संशोधित कर रहे हैं t.root = Node(4)), जो एक तरह से कैप्सूलीकरण (पहली जगह में कक्षाएं होने के पूरे मुद्दे) को नष्ट कर देता; आप और अधिक की तरह कुछ करना चाहिए

def main():
    t = Tree()
    t.add(4)    # <- let the tree create a data Node and insert it
    t.add(5)
26/03/2011 को 20:01
का स्रोत उपयोगकर्ता

वोट
1

आप पर शुरू करने के लिए मदद करने के लिए बस कुछ।

एक द्विआधारी पेड़ खोज (की सरल विचार) काफी संभावना होगी अजगर लाइनों अनुसार में लागू किया जा:

def search(node, key):
    if node is None: return None  # key not found
    if key< node.key: return search(node.left, key)
    elif key> node.key: return search(node.right, key)
    else: return node.value  # found key

अब तुम सिर्फ मचान (पेड़ सृजन और मूल्य डालता है) को लागू करने की जरूरत है और आप कर रहे हैं।

26/03/2011 को 20:12
का स्रोत उपयोगकर्ता

वोट
45

यहाँ एक बाइनरी डालने की एक त्वरित उदाहरण है:

class Node:
    def __init__(self, val):
        self.l_child = None
        self.r_child = None
        self.data = val

def binary_insert(root, node):
    if root is None:
        root = node
    else:
        if root.data > node.data:
            if root.l_child is None:
                root.l_child = node
            else:
                binary_insert(root.l_child, node)
        else:
            if root.r_child is None:
                root.r_child = node
            else:
                binary_insert(root.r_child, node)

def in_order_print(root):
    if not root:
        return
    in_order_print(root.l_child)
    print root.data
    in_order_print(root.r_child)

def pre_order_print(root):
    if not root:
        return        
    print root.data
    pre_order_print(root.l_child)
    pre_order_print(root.r_child)    

r = Node(3)
binary_insert(r, Node(7))
binary_insert(r, Node(1))
binary_insert(r, Node(5))

     3
    / \
   1   7
      /
     5

print "in order:"
in_order_print(r)

print "pre order"
pre_order_print(r)

in order:
1
3
5
7
pre order
3
1
7
5
26/03/2011 को 20:35
का स्रोत उपयोगकर्ता

वोट
5
class Node:
    rChild,lChild,parent,data = None,None,None,0    

def __init__(self,key):
    self.rChild = None
    self.lChild = None
    self.parent = None
    self.data = key 

class Tree:
    root,size = None,0
    def __init__(self):
        self.root = None
        self.size = 0
    def insert(self,someNumber):
        self.size = self.size+1
        if self.root is None:
            self.root = Node(someNumber)
        else:
            self.insertWithNode(self.root, someNumber)    

    def insertWithNode(self,node,someNumber):
        if node.lChild is None and node.rChild is None:#external node
            if someNumber > node.data:
                newNode = Node(someNumber)
                node.rChild = newNode
                newNode.parent = node
            else:
                newNode = Node(someNumber)
                node.lChild = newNode
                newNode.parent = node
        else: #not external
            if someNumber > node.data:
                if node.rChild is not None:
                    self.insertWithNode(node.rChild, someNumber)
                else: #if empty node
                    newNode = Node(someNumber)
                    node.rChild = newNode
                    newNode.parent = node 
            else:
                if node.lChild is not None:
                    self.insertWithNode(node.lChild, someNumber)
                else:
                    newNode = Node(someNumber)
                    node.lChild = newNode
                    newNode.parent = node                    

    def printTree(self,someNode):
        if someNode is None:
            pass
        else:
            self.printTree(someNode.lChild)
            print someNode.data
            self.printTree(someNode.rChild)

def main():  
    t = Tree()
    t.insert(5)  
    t.insert(3)
    t.insert(7)
    t.insert(4)
    t.insert(2)
    t.insert(1)
    t.insert(6)
    t.printTree(t.root)

if __name__ == '__main__':
    main()

मेरे समाधान।

26/03/2011 को 21:06
का स्रोत उपयोगकर्ता

वोट
6
class BST:
    def __init__(self, val=None):
        self.left = None
        self.right = None
        self.val = val

    def __str__(self):
        return "[%s, %s, %s]" % (self.left, str(self.val), self.right)

    def isEmpty(self):
        return self.left == self.right == self.val == None

    def insert(self, val):
        if self.isEmpty():
            self.val = val
        elif val < self.val:
            if self.left is None:
                self.left = BST(val)
            else:
                self.left.insert(val)
        else:
            if self.right is None:
                self.right = BST(val)
            else:
                self.right.insert(val)

a = BST(1)
a.insert(2)
a.insert(3)
a.insert(0)
print a
15/08/2012 को 03:31
का स्रोत उपयोगकर्ता

वोट
1

प्रकार कुंजी के साथ एक और अजगर BST (मूल्य के लिए दोषी)

LEFT = 0
RIGHT = 1
VALUE = 2
SORT_KEY = -1

class BinarySearchTree(object):

    def __init__(self, sort_key=None):
        self._root = []  
        self._sort_key = sort_key
        self._len = 0  

def insert(self, val):
    if self._sort_key is None:
        sort_key = val // if no sort key, sort key is value
    else:
        sort_key = self._sort_key(val)

    node = self._root
    while node:
        if sort_key < node[_SORT_KEY]:
            node = node[LEFT]
        else:
            node = node[RIGHT]

    if sort_key is val:
        node[:] = [[], [], val]
    else:
        node[:] = [[], [], val, sort_key]
    self._len += 1

def minimum(self):
    return self._extreme_node(LEFT)[VALUE]

def maximum(self):
    return self._extreme_node(RIGHT)[VALUE]

def find(self, sort_key):
    return self._find(sort_key)[VALUE]

def _extreme_node(self, side):
    if not self._root:
        raise IndexError('Empty')
    node = self._root
    while node[side]:
        node = node[side]
    return node

def _find(self, sort_key):
    node = self._root
    while node:
        node_key = node[SORT_KEY]
        if sort_key < node_key:
            node = node[LEFT]
        elif sort_key > node_key:
            node = node[RIGHT]
        else:
            return node
    raise KeyError("%r not found" % sort_key)
29/04/2013 को 11:25
का स्रोत उपयोगकर्ता

वोट
1

यहाँ एक कॉम्पैक्ट, वस्तु उन्मुख, पुनरावर्ती दिया गया है:

    class BTreeNode(object):
        def __init__(self, data):
            self.data = data
            self.rChild = None
            self.lChild = None

    def __str__(self):
        return (self.lChild.__str__() + '<-' if self.lChild != None else '') + self.data.__str__() + ('->' + self.rChild.__str__() if self.rChild != None else '')

    def insert(self, btreeNode):
        if self.data > btreeNode.data: #insert left
            if self.lChild == None:
                self.lChild = btreeNode
            else:
                self.lChild.insert(btreeNode)
        else: #insert right
            if self.rChild == None:
                self.rChild = btreeNode
            else:
                self.rChild.insert(btreeNode)


def main():
    btreeRoot = BTreeNode(5)
    print 'inserted %s:' %5, btreeRoot

    btreeRoot.insert(BTreeNode(7))
    print 'inserted %s:' %7, btreeRoot

    btreeRoot.insert(BTreeNode(3))
    print 'inserted %s:' %3, btreeRoot

    btreeRoot.insert(BTreeNode(1))
    print 'inserted %s:' %1, btreeRoot

    btreeRoot.insert(BTreeNode(2))
    print 'inserted %s:' %2, btreeRoot

    btreeRoot.insert(BTreeNode(4))
    print 'inserted %s:' %4, btreeRoot

    btreeRoot.insert(BTreeNode(6))
    print 'inserted %s:' %6, btreeRoot

ऊपर मुख्य के उत्पादन में () है:

inserted 5: 5
inserted 7: 5->7
inserted 3: 3<-5->7
inserted 1: 1<-3<-5->7
inserted 2: 1->2<-3<-5->7
inserted 4: 1->2<-3->4<-5->7
inserted 6: 1->2<-3->4<-5->6<-7
04/09/2013 को 03:33
का स्रोत उपयोगकर्ता

वोट
2

मैं समाधान थोड़ा पर अनाड़ी लगता है insertहिस्सा। आप लौट सकते हैं rootसंदर्भ और यह थोड़ा आसान बनाने:

def binary_insert(root, node):
    if root is None:
        return node
    if root.data > node.data:
        root.l_child = binary_insert(root.l_child, node)
    else:
        root.r_child = binary_insert(root.r_child, node)
    return root
24/09/2014 को 00:09
का स्रोत उपयोगकर्ता

वोट
-1

यहाँ एक नमूना कार्यान्वयन है कि अगर मदद करता है।

10/11/2015 को 15:12
का स्रोत उपयोगकर्ता

वोट
0

निम्नलिखित कोड @ DTing के जवाब और क्या मैं वर्ग है, जो सम्मिलित करने के लिए थोड़ी देर के पाश (कोड में किया है) का उपयोग करता है से सीख पर बुनियादी है।

class Node:
    def __init__(self, val):
        self.l_child = None
        self.r_child = None
        self.data = val


def binary_insert(root, node):
    y = None
    x = root
    z = node
    #while loop here
    while x is not None:
        y = x
        if z.data < x.data:
            x = x.l_child
        else:
            x = x.r_child
    z.parent = y
    if y == None:
        root = z
    elif z.data < y.data:
        y.l_child = z
    else:
        y.r_child = z


def in_order_print(root):
    if not root:
        return
    in_order_print(root.l_child)
    print(root.data)
    in_order_print(root.r_child)


r = Node(3)
binary_insert(r, Node(7))
binary_insert(r, Node(1))
binary_insert(r, Node(5))

in_order_print(r)
08/04/2016 को 10:19
का स्रोत उपयोगकर्ता

वोट
0

यहाँ एक काम समाधान है।

class BST:
    def __init__(self,data):
        self.root = data
        self.left = None
        self.right = None

    def insert(self,data):
        if self.root == None:
            self.root = BST(data)
        elif data > self.root:
            if self.right == None:
                self.right = BST(data)
            else:
                self.right.insert(data)
        elif data < self.root:
            if self.left == None:
                self.left = BST(data)
            else:
                self.left.insert(data)

    def inordertraversal(self):
        if self.left != None:
            self.left.inordertraversal()
        print (self.root),
        if self.right != None:
            self.right.inordertraversal()

t = BST(4)
t.insert(1)
t.insert(7)
t.insert(3)
t.insert(6)
t.insert(2)
t.insert(5)
t.inordertraversal()
24/04/2017 को 19:22
का स्रोत उपयोगकर्ता

वोट
0

अपनी आसान एक BST दो वर्गों, 1. नोड और 2 ट्री ट्री वर्ग का उपयोग कर सिर्फ यूजर इंटरफेस के लिए किया जाएगा लागू करने के लिए, और वास्तविक तरीकों नोड कक्षा में लागू किया जाएगा।

class Node():

    def __init__(self,val):
        self.value = val
        self.left = None
        self.right = None


    def _insert(self,data):
        if data == self.value:
            return False
        elif data < self.value:
            if self.left:
                return self.left._insert(data)
            else:
                self.left = Node(data)
                return True
        else:
            if self.right:
                return self.right._insert(data)
            else:
                self.right = Node(data)
                return True

    def _inorder(self):
        if self:
            if self.left:
                self.left._inorder()
            print(self.value)
            if self.right:
                self.right._inorder()



class Tree():

    def __init__(self):
        self.root = None

    def insert(self,data):
        if self.root:
            return self.root._insert(data)
        else:
            self.root = Node(data)
            return True
    def inorder(self):
        if self.root is not None:
            return self.root._inorder()
        else:
            return False




if __name__=="__main__":
    a = Tree()
    a.insert(16)
    a.insert(8)
    a.insert(24)
    a.insert(6)
    a.insert(12)
    a.insert(19)
    a.insert(29)
    a.inorder()

देखना हो BST ठीक तरह से लागू किया जाता है के लिए समारोह के लिए inorder।

06/07/2017 को 08:37
का स्रोत उपयोगकर्ता

वोट
0

स्वीकार किए जाते हैं जवाब डाला प्रत्येक नोड के लिए एक माता पिता के गुण है, जो बिना एक एक लागू नहीं कर सकते सेट करने के लिए neglects successorतरीका है जिसमें एक में आदेश पेड़ की पैदल दूरी में उत्तराधिकारी पाता हे ( ) समय है, जहां के रूप में विरोध किया पेड़ की ऊंचाई है ( करने के लिए हे ( एन टहलने के लिए आवश्यक) समय)।

। यहाँ Cormen एट अल में दिए गए स्यूडोकोड के आधार पर एक कार्यान्वयन है, एल्गोरिथम का परिचय , एक का काम सहित parentविशेषता है और एक successorविधि:

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


class Tree(object):
    def __init__(self, root=None):
        self.root = root

    def insert(self, z):
        y = None
        x = self.root
        while x is not None:
            y = x
            if z.key < x.key:
                x = x.left
            else:
                x = x.right
        z.parent = y
        if y is None:
            self.root = z       # Tree was empty
        elif z.key < y.key:
            y.left = z
        else:
            y.right = z

    @staticmethod
    def minimum(x):
        while x.left is not None:
            x = x.left
        return x

    @staticmethod
    def successor(x):
        if x.right is not None:
            return Tree.minimum(x.right)
        y = x.parent
        while y is not None and x == y.right:
            x = y
            y = y.parent
        return y

यहाँ कुछ परीक्षण है कि वृक्ष के रूप में द्वारा दिए गए उदाहरण के लिए उम्मीद बर्ताव करता है दिखाने के लिए कर रहे हैं DTing :

import pytest

@pytest.fixture
def tree():
    t = Tree()
    t.insert(Node(3))
    t.insert(Node(1))
    t.insert(Node(7))
    t.insert(Node(5))
    return t

def test_tree_insert(tree):
    assert tree.root.key == 3
    assert tree.root.left.key == 1
    assert tree.root.right.key == 7
    assert tree.root.right.left.key == 5

def test_tree_successor(tree):
    assert Tree.successor(tree.root.left).key == 3
    assert Tree.successor(tree.root.right.left).key == 7

if __name__ == "__main__":
    pytest.main([__file__])
25/08/2017 को 10:42
का स्रोत उपयोगकर्ता

वोट
0

समस्या यह है, अपने कोड के साथ या कम से कम एक समस्या यहाँ है: -

def insert(self,node,someNumber):
    if node is None:
        node = Node(someNumber)
    else:
        if node.data > someNumber:
            self.insert(node.rchild,someNumber)
        else:
            self.insert(node.rchild, someNumber)
    return

आप बयान देख "अगर node.data> someNumber:" और संबद्ध "और" बयान दोनों उनके पीछे एक ही कोड है। यानी आप एक ही बात है कि क्या अगर बयान सही या गलत है।

मैं आप शायद यहाँ अलग काम करने के लिए, शायद इनमें से किसी एक कहना चाहिए self.insert (node.lchild, someNumber) इरादा सुझाव देंगे?

26/11/2018 को 16:21
का स्रोत उपयोगकर्ता

वोट
0

एक और अजगर BST समाधान

class Node(object):
    def __init__(self, value):
        self.left_node = None
        self.right_node = None
        self.value = value

    def __str__(self):
        return "[%s, %s, %s]" % (self.left_node, self.value, self.right_node)

    def insertValue(self, new_value):
        """
        1. if current Node doesnt have value then assign to self
        2. new_value lower than current Node's value then go left
        2. new_value greater than current Node's value then go right
        :return:
        """
        if self.value:
            if new_value < self.value:
                # add to left
                if self.left_node is None:  # reached start add value to start
                    self.left_node = Node(new_value)
                else:
                    self.left_node.insertValue(new_value)  # search
            elif new_value > self.value:
                # add to right
                if self.right_node is None:  # reached end add value to end
                    self.right_node = Node(new_value)
                else:
                    self.right_node.insertValue(new_value)  # search
        else:
            self.value = new_value

    def findValue(self, value_to_find):
        """
        1. value_to_find is equal to current Node's value then found
        2. if value_to_find is lower than Node's value then go to left
        3. if value_to_find is greater than Node's value then go to right
        """
        if value_to_find == self.value:
            return "Found"
        elif value_to_find < self.value and self.left_node:
            return self.left_node.findValue(value_to_find)
        elif value_to_find > self.value and self.right_node:
            return self.right_node.findValue(value_to_find)
        return "Not Found"

    def printTree(self):
        """
        Nodes will be in sequence
        1. Print LHS items
        2. Print value of node
        3. Print RHS items
        """
        if self.left_node:
            self.left_node.printTree()
        print(self.value),
        if self.right_node:
            self.right_node.printTree()

    def isEmpty(self):
        return self.left_node == self.right_node == self.value == None


def main():
    root_node = Node(12)
    root_node.insertValue(6)
    root_node.insertValue(3)
    root_node.insertValue(7)

    # should return 3 6 7 12
    root_node.printTree()

    # should return found
    root_node.findValue(7)
    # should return found
    root_node.findValue(3)
    # should return Not found
    root_node.findValue(24)

if __name__ == '__main__':
    main()
14/04/2019 को 15:07
का स्रोत उपयोगकर्ता

वोट
0
    def BinaryST(list1,key):
    start = 0
    end = len(list1)
    print("Length of List: ",end)

    for i in range(end):
        for j in range(0, end-i-1):
            if(list1[j] > list1[j+1]):
                temp = list1[j]
                list1[j] = list1[j+1]
                list1[j+1] = temp

    print("Order List: ",list1)

    mid = int((start+end)/2)
    print("Mid Index: ",mid)

    if(key == list1[mid]):
        print(key," is on ",mid," Index")

    elif(key > list1[mid]):
        for rindex in range(mid+1,end):
            if(key == list1[rindex]):
                print(key," is on ",rindex," Index")
                break
            elif(rindex == end-1):
                print("Given key: ",key," is not in List")
                break
            else:
                continue

    elif(key < list1[mid]):
        for lindex in range(0,mid):
            if(key == list1[lindex]):
                print(key," is on ",lindex," Index")
                break
            elif(lindex == mid-1):
                print("Given key: ",key," is not in List")
                break
            else:
                continue


size = int(input("Enter Size of List: "))
list1 = []
for e in range(size):
    ele = int(input("Enter Element in List: "))
    list1.append(ele)

key = int(input("\nEnter Key for Search: "))

print("\nUnorder List: ",list1)
BinaryST(list1,key)
02/01/2020 को 17:20
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more