首页 > 代码库 > 【剑指offer】二叉搜索树与双向链表

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

分析:

还是二叉树遍历模板的改造问题,对于二叉搜索树,中序遍历的结果是有顺序的。题目的要求无非是将中序遍历的结点访问结果链接起来,至于双向链表,通过复用树结点的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

树的建立只是为了简单测试下,写的很丑陋。