分析:
还是二叉树遍历模板的改造问题,对于二叉搜索树,中序遍历的结果是有顺序的。题目的要求无非是将中序遍历的结点访问结果链接起来,至于双向链表,通过复用树结点的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
【剑指offer】二叉搜索树与双向链表,布布扣,bubuko.com
原文地址:http://blog.csdn.net/shiquxinkong/article/details/34936647