コード例 #1
0
        """
        按照中根遍历的顺序构建BST
        :param head: ListNode
        :param begin: int
        :param end: int
        :return: TreeNode
        """
        if begin > end:
            return  None
        mid = (begin+end)//2
        leftTree = self.buildBST(begin,mid-1)
        root = TreeNode(self.node.val)
        root.left = leftTree
        self.node = self.node.next
        root.right = self.buildBST(mid+1,end)
        return  root

if __name__ == '__main__':

    so = Solution()
    head = ListNode.getOneListNode([1,2,3,4,5])
    root = so.sortedListToBST(head)
    TreeNode.inOrderRec(root)







            return None
        return  self.buildTreeFromInPost(inorder,0,len(inorder)-1,postorder,0,len(postorder)-1)

    def buildTreeFromInPost(self,inorder,iB,iE,postorder,pB,pE):
        """
        根据中根和后根遍历构建二叉树。后跟遍历的最后一个是根。
        :param inorder: List[int]
        :param iB:int
        :param iE:int
        :param postorder: List[int]
        :param pB: int
        :param pE:int
        :return:TreeNode
        """
        if iB > iE or pB > pE:return  None
        if iB == iE:
            return  TreeNode(inorder[iE])
        root = TreeNode(postorder[pE])
        mid = inorder.index(postorder[pE])
        leftLen = mid - iB
        root.left = self.buildTreeFromInPost(inorder,iB,mid-1,postorder,pB,pB+leftLen-1)
        root.right = self.buildTreeFromInPost(inorder,mid+1,iE,postorder,pB+leftLen,pE-1)
        return root

if __name__ == '__main__':
    so = Solution()

    root = so.buildTree([0,1,2,3,4,5,6,],[0,2,1,4,6,5,3])
    TreeNode.inOrderRec(root)

        """
        根据先根和中根还原二叉树。
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        """
        if not preorder:
            return None
        return  self.buildTreeFromPreIn(preorder,0,len(preorder)-1,inorder,0,len(inorder)-1)

    def buildTreeFromPreIn(self,preorder,pB,pE,inorder,iB,iE):
        if pB > pE or iB > iE:
            return None
        if pB == pE:
            return TreeNode(preorder[pE])
        root = TreeNode(preorder[pB])
        mid = 0
        for i in range(iB,iE+1):
            if inorder[i] == preorder[pB]:
                mid = i
                break
        leftSize = mid-iB
        root.left = self.buildTreeFromPreIn(preorder,pB+1,pB+leftSize,inorder,iB,mid-1)
        root.right = self.buildTreeFromPreIn(preorder,pB+leftSize+1,pE,inorder,mid+1,iE)
        return root

if __name__ == '__main__':

    so = Solution()
    TreeNode.inOrderRec(so.buildTree([1,2,4,3],[4,2,1,3]))