题目
https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
思路
二叉搜索树:根节点,大于左节点,小于右节点。
得到后序遍历结果,判断是否满足二叉搜索树的规则。
关键在于,如何找到根节点、及其左节点和右节点。
分析后续遍历,可知道最后一个数字是树根节点的值。
进一步地,划分左右节点。依据是根节点大于左节点,小于右节点。
代码
class Solution:def verifyPostorder(self, postorder: List[int]) -> bool:# if not postorder:# return Falseif len(postorder) <= 1:return Trueroot = postorder[-1]for ind, value in enumerate(postorder):if value > root:left = postorder[:ind]if ind < len(postorder):right = postorder[ind:len(postorder)-1]else:right = []breakelse:left = postorder[:-1]right = []# print(root, left, right)return all(num < root for num in left) and all(num > root for num in right) and self.verifyPostorder(postorder[:-1])
class Solution:def verifyPostorder(self, postorder: List[int]) -> bool:length = len(postorder)if length <= 1:return Trueroot = postorder[length - 1] # 根节点# 查找左节点,左节点的值应小于根节点leftIndex = 0while leftIndex < length - 1:if postorder[leftIndex] > root:breakleftIndex += 1# 判断右子树符合二叉搜索树规则rightIndex = leftIndexwhile rightIndex < length - 1:if postorder[rightIndex] < root:return FalserightIndex += 1# 判断左子树是不是二叉搜索树# print('ok')left = self.verifyPostorder(postorder[ : leftIndex])right = self.verifyPostorder(postorder[leftIndex : rightIndex])return left & right
扩展
重建二叉树也是同样的思路。
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:if not inorder:return Noneroot = TreeNode(preorder.pop(0))index = inorder.index(root.val)root.left = self.buildTree(preorder, inorder[:index])root.right = self.buildTree(preorder, inorder[index+1:])return root
- 二叉树后序遍历
- 输入一个整数数组,判断该数组是不是某二叉搜索树的前序遍历的结果。
