[Leetcode] Construct Binary Tree from Inorder and Postorder/Preorder and Inorder Traversal

来源:互联网 发布:如何检查windows更新 编辑:程序博客网 时间:2024/05/17 20:33

Given inorder and postorder/preorder and inorder traversal of a tree, construct the binary tree.

Note:

You may assume that duplicates do not exist in the tree.

思路:用递归的思想,inorder是先左,中,右,而postorder是左,右, 中。因而每次递归返回当前子树的root,root就是postorder的最后一个,然后再寻找当前子树的左子树和右子树的根作为root的左右child,在此过程中寻找inorder list和postorder list中对应的左子树和右子树。

如果是preorder和inorder, 思路完全一样,注意递归时候参数的传递

inorder and postorder:

# Definition for a  binary tree node# class TreeNode:#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution:    # @param inorder, a list of integers    # @param postorder, a list of integers    # @return a tree node    def createTree(self, inorder, postorder, li, ri, lp, rp):        if li > ri or lp > rp:            return None        else:            root = TreeNode(postorder[rp])            i = li            while inorder[i] != postorder[rp]:                i += 1            root.left = self.createTree(inorder, postorder, li, i-1, lp, lp+i-1-li)            root.right = self.createTree(inorder, postorder, i+1, ri, lp+i-li, rp-1)        return root    def buildTree(self, inorder, postorder):        return self.createTree(inorder, postorder, 0, len(inorder) - 1, 0, len(postorder) - 1)

preorder and inorder:

# Definition for a  binary tree node# class TreeNode:#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = Noneclass Solution:    # @param preorder, a list of integers    # @param inorder, a list of integers    # @return a tree node    def createTree(self, preorder, inorder, lp, rp, li, ri):        if lp > rp or li > ri:            return None        else:            root = TreeNode(preorder[lp])            i = li            while inorder[i] != preorder[lp]:                i += 1            root.left = self.createTree(preorder, inorder, lp+1, lp+i-1-li+1, li, i-1)            root.right = self.createTree(preorder, inorder, lp+i-1-li+2, rp, i+1, ri)        return root    def buildTree(self, preorder, inorder):        return self.createTree(preorder, inorder, 0, len(preorder)-1, 0, len(inorder)-1)


0 0
原创粉丝点击