题目
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 False
if len(postorder) <= 1:
return True
root = 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 = []
break
else:
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 True
root = postorder[length - 1] # 根节点
# 查找左节点,左节点的值应小于根节点
leftIndex = 0
while leftIndex < length - 1:
if postorder[leftIndex] > root:
break
leftIndex += 1
# 判断右子树符合二叉搜索树规则
rightIndex = leftIndex
while rightIndex < length - 1:
if postorder[rightIndex] < root:
return False
rightIndex += 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 = None
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
if not inorder:
return None
root = 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
- 二叉树后序遍历
- 输入一个整数数组,判断该数组是不是某二叉搜索树的前序遍历的结果。