""" 按照中根遍历的顺序构建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]))