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

题目博客: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[n])
    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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值