AVL Balancing
John Machin
sjmachin at lexicon.net
Wed Nov 22 19:29:53 EST 2006
scbauer wrote:
> John Machin wrote:
> > scba... at gmail.com wrote:
> > > Im working on an AVL tree
> >
> > Is this homework?
> Yes, this is homework.
It was a rhetorical question :-)
>
> >
> > > that consists of balancing the tree everytime
> > > you add an object.
> >
> > That's a peculiar kind of AVL tree. Normally it is *not* necessary to
> > balance the tree every time a node is added -- it's done only if a
> > constraint is breached.
>
> You're right the AVL Tree shouldnt be updated everytime.
>
> >
> > > Im not quite grasping the concept on how to do this
> > > with python.
> >
> > Could you do it in any other language?
> No, this is an Advanced Algorithms class have to use python
I meant: do you have the ability ("can") (not the permission ("may"))
to do it in another language.
>
> >
> > > I have seen a few topics on the web about this, and i
> > > clearly understand how when the balance of an AVL tree get to 2 or -2
> > > you have to do a R, L, LR, or a RL rotation. Could anyone possibly help
> > > me/point me in the right direction as far as checking the balance and
> > > actually balancing the tree? Thanks in advance
> >
> class AVLTree:
> """Holds operations of tree"""
> def __init__(self):
>
> self.__root = None
> self.__stack=[]
> stack = self.__stack
>
> def addNode(self, data):
> """ Add node for tree"""
> return Node(data)
>
> def insert(self, data):
> if self.__root == None:
> self.__root = Node(data)
> else:
> current = self.__root
> done = False
> while not done:
> if data < current.get_data():
> if current.left == None:
> current.left = Node(data)
> stack.append(current)
>
> done = True
> else:
> current = current.left
> else:
> if current.right == None:
> current.right = Node(data)
> stack.append(current)
>
> done = True
> else:
> current = current.right
>
and where's the definition of your Node class?
> > Perhaps if you could show us what you have done already -- I'd be
> > expecting a class to represent a node, and maybe another to represent
> > the root of the tree -- and give us an idea of your Python proficency
> > level (so that we can tailor the advice accordingly), we could help
> > you.
>
> Basically what im trying to do is use a stack to keep track of the
> items in the AVL tree so that rotations will go smoothly. Having
> problems with the stack getting initialized and actually storing the
> data there. So that i can reference the elements stack[-3].left =
> stack[-2].right and so on for balancing.
... and avoiding trouble when there are fewer than 3 elements in the
stack.
I presume that you a righteous dude, and are avoiding the temptation to
google for "AVL tree Python".
So, I'll give you just one hint:
Being righteous, you may wish to examine the ancient scriptures: find
volume 3 of the gospel according to Saint Donald Knuth; therein lies a
description (in arcane notation) of how to insert into a "balanced
tree" without using a stack. If a dumb cluck like me could translate
that into C (with no gotos) and get it to work, a smart lad should have
no trouble translating it into Python.
HTH,
John
More information about the Python-list
mailing list