您的位置:首页 > 其它

第一题:把二元查找树转变成排序的双向链表

2014-05-24 11:23 337 查看
题目博客:http://blog.csdn.net/v_JULY_v/article/details/6057286

题目:

1.把二元查找树转变成排序的双向链表(树)

题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

10

/ /

6 14

/ / / /

4 8 12 16

转换成双向链表

4=6=8=10=12=14=16。

首先我们定义的二元查找树 节点的数据结构如下:

struct BSTreeNode

{

int m_nValue; // value of node

BSTreeNode *m_pLeft; // left child of node

BSTreeNode *m_pRight; // right child of node

};

。。。。

我先把创建了新结点的代码贴出来吧。

代码为:

__author__ = 'Administrator'
class TreeNode:
def __init__(self,value,leftChild=None,rightChild=None):
d=locals()
d.pop("self")
codeObject=self.__init__.im_func.func_code
argumentNames=codeObject.co_varnames[1:codeObject.co_argcount]
for name in  argumentNames:
setattr(self,name,d[name])
class LinkedNode:
def __init__(self,value,pre=None,next=None):
d=locals()
d.pop("self")
codeObj=self.__init__.im_func.func_code
argumentNames=codeObj.co_varnames[1:codeObj.co_argcount]
for n in argumentNames:
setattr(self,n,d
)
def __cmp__(self, other):
return cmp(self.value,other.value)
class LinkedList:
def __init__(self,head=None):
self.head=None
def Add(self,nodevalue):
newnode=LinkedNode(value=nodevalue)
if not self.head:
self.head=newnode
else:
self.AddNode(newnode,self.head)
def AddNode(self,newnode,curNode):
if curNode<newnode:
if not  curNode.next:
curNode.next,newnode.pre=newnode,curNode
elif curNode.next<newnode:
self.AddNode(newnode,curNode.next)
else:
curNode.next.pre,newnode.next=newnode,curNode.next
curNode.next,newnode.pre=newnode,curNode
else:
if not  curNode.pre:
curNode.pre,newnode.next=newnode,curNode
if newnode<self.head:
self.head=newnode
else:
if curNode.pre>newnode:
self.AddNode(newnode,curNode.pre)
else:
curNode.pre.next,newnode.pre=newnode,curNode.pre
curNode.pre,newnode.next=newnode,curNode
if newnode<self.head:
self.head=newnode
if __name__=="__main__":
node4=TreeNode(4)
node8=TreeNode(8)
node12=TreeNode(12)
node16=TreeNode(16)
node6=TreeNode(6,rightChild=node8,leftChild=node4)
node14=TreeNode(14,leftChild=node12,rightChild=node16)
node10=TreeNode(10,leftChild=node6,rightChild=node14)
linkedlist=LinkedList()
for node in [node4,node6,node8,node10,node12,node14,node16]:
linkedlist.Add(node.value)
curnode=linkedlist.head
while 1:
if not curnode:
break
else:
print curnode.value
curnode=curnode.next
但是不新建结点的话,怎么做呢。。。呃呃。。。。

看了别人的再改的。

class TreeNode:
def __init__(self,value,leftChild=None,rightChild=None):
d=locals()
d.pop("self")
codeObject=self.__init__.im_func.func_code
argumentNames=codeObject.co_varnames[1:codeObject.co_argcount]
for name in  argumentNames:
setattr(self,name,d[name])

def treeToLinkedList( root):
head,tail=None,None
head,tail=helper(head,tail,root)
return head
def helper(begin,end,root):
b_end,e_begin=None,None
if not root:
begin,end=None,None
return begin,end
begin,b_end=helper(begin,b_end,root.leftChild)
e_begin,end=helper(e_begin,end,root.rightChild)
if not b_end:
begin=root
else:
b_end.rightChild,root.leftChild=root,begin
if e_begin:
e_begin.leftChild,root.rightChild=root,e_begin
else:
end=root
return begin,end
if __name__=="__main__":
node4=TreeNode(4)
node8=TreeNode(8)
node12=TreeNode(12)
node16=TreeNode(16)
node6=TreeNode(6,rightChild=node8,leftChild=node4)
node14=TreeNode(14,leftChild=node12,rightChild=node16)
node10=TreeNode(10,leftChild=node6,rightChild=node14)
curnode=treeToLinkedList(node10)
while 1:
if not curnode:
break
else:
print curnode.value
curnode=curnode.rightChild
呵呵。。。。相比而言,自己做的次真的是又臭又长。。。

哎。。迭代。。总是理不清楚啊。。。有时候不知道怎么迭代啊!!!!

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

bbbbbbbbbbbbbb
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: