def dfs(self,begin,end): """ 从begin到end,生成BST :param begin:int :param end: int :return: List[TreeNode] """ ans = [] if begin > end: ans.append(None) return ans if begin == end: t = TreeNode(begin) ans.append(t) return ans if begin +1 == end: t1 = TreeNode(begin) t1.right = TreeNode(end) ans.append(t1) t2 = TreeNode(end) t2.left = TreeNode(begin) ans.append(t2) return ans for i in range(begin,end+1): leftTreeSet = self.dfs(begin,i-1) rightTreeSet = self.dfs(i+1,end) for nodeL in leftTreeSet: for nodeR in rightTreeSet: ro = TreeNode(i) ro.left = nodeL ro.right = nodeR ans.append(ro) return ans
def dfs(self, begin, end): """ 从begin到end,生成BST :param begin:int :param end: int :return: List[TreeNode] """ ans = [] if begin > end: ans.append(None) return ans if begin == end: t = TreeNode(begin) ans.append(t) return ans if begin + 1 == end: t1 = TreeNode(begin) t1.right = TreeNode(end) ans.append(t1) t2 = TreeNode(end) t2.left = TreeNode(begin) ans.append(t2) return ans for i in range(begin, end + 1): leftTreeSet = self.dfs(begin, i - 1) rightTreeSet = self.dfs(i + 1, end) for nodeL in leftTreeSet: for nodeR in rightTreeSet: ro = TreeNode(i) ro.left = nodeL ro.right = nodeR ans.append(ro) return ans
def buildBST(self,nums,i,j): if i> j : return None if i == j: no = TreeNode(nums[i]) return no mid = (i+j)//2 root = TreeNode(nums[mid]) left = self.buildBST(nums,i,mid-1) right = self.buildBST(nums,mid+1,j) root.left = left root.right = right return root
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
def buildBST(self, begin, end): """ 按照中根遍历的顺序构建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
def buildBST(self,begin,end): """ 按照中根遍历的顺序构建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
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
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