您的位置:首页 > Web前端

【剑指offer:】Q27:二叉搜索树与双向链表

2014-06-26 22:33 375 查看
分析:

还是二叉树遍历模板的改造问题,对于二叉搜索树,中序遍历的结果是有顺序的。题目的要求无非是将中序遍历的结点访问结果链接起来,至于双向链表,通过复用树结点的left 和 right 指针就可以完成。最直接的就是我们可以把中序遍历中访问到的每个结点都放入到个队列里,然后将队列的元素链接起来,但是题目不允许用额外的空间。

想想中心遍历,遍历顺序是 左 --根---右,那么中序遍历的第一个访问结点肯定是树的左子树的最底下的结点,该结点无左孩子。也就是下面的两种情况:



在想想我们创建链表的过程,若采用尾部插入法,那么设定一个头指针head,一个尾指针tail,新结点链接上tail,tail指向新节点,就是下面这样的情况:



通过上面的case1和case2 我们知道,第一个访问的结点,没有左孩子,那么其left指针就可以去指向下面图示中的tail,当然这里涉及到第一个结点的特殊处理,也就是head和tail为NULL时,这个也很简单,在建立链表的时候都遇到过。



//功能函数代码

def convert(self, root):
if root == None:
return
self.convert(root.left)
if self.tail == None:
self.tail = root
self.head = root
else:
self.tail.right = root
root.left = self.tail
self.tail = root
self.convert(root.right)


//全部代码,包括结构的定义,树的建立

class treenode:
def __init__(self, left = None, right = None, val = 0):
self.left = left
self.right = right
self.val = val;

class Tree:
def __init__(self, root = None):
self.root = root
self.head = None
self.tail = None
if self.root == None:
self.root = treenode(val = 10)

def createTree(self):
node1 = treenode(val = 6)
self.root.left = node1
node2 = treenode(val = 14)
self.root.right = node2
node3 = treenode(val = 4)
self.root.left.left = node3
return self.root

def convert(self, root):
if root == None:
return
self.convert(root.left)
if self.tail == None:
self.tail = root
self.head = root
else:
self.tail.right = root
root.left = self.tail
self.tail = root
self.convert(root.right)

def test():
tree = Tree()
root = tree.createTree()
tree.convert(root)
return tree.head


树的建立只是为了简单测试下,写的很丑陋。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: