【剣指Offer】二叉探索木の後序遍歴シーケンス解題報告(Python)
【剣指Offer】二叉探索木の後序遍歴シーケンス解題報告(Python)
ラベル(スペース区切り):剣指Offer
タイトルアドレス:https://www.nowcoder.com/ta/coding-interviews
タイトルの説明:
整数配列を入力し、その配列が二叉探索ツリーの後順に遍歴した結果であるかどうかを判断します.もしそうであればYesを出力し、そうでなければNoを出力します.入力された配列の任意の2つの数字が互いに異なると仮定します.
解題方法
BSTの中順序遍歴は秩序化され,後順序遍歴,最後のノードはルートノードであることを知っている.では、まずルートノードを探して、ルートノードの値を利用して、配列を2つの部分に分けて、前の部分はルートノードより小さくて左のサブツリーで、後ろの部分はルートノードより大きくて右のサブツリーです.それからそれぞれ左右の子木を遍歴すればいいです.私はこの問題をするときに左遍歴から最初のルートノードより大きい位置を見つけて左右のノードを区分し,左の部分がルートノードより小さいことを保証し,右の部分がルートノードより大きいことを保証できないので,右の部分を検証した.また,問題にはピットがあり,空木はBSTではないと考えられているため,関数を新たに定義して再帰しないと,より簡単になる.
Date
2018年3月20日–日差しがちょうど良く、安心して勉強
ラベル(スペース区切り):剣指Offer
タイトルアドレス:https://www.nowcoder.com/ta/coding-interviews
タイトルの説明:
整数配列を入力し、その配列が二叉探索ツリーの後順に遍歴した結果であるかどうかを判断します.もしそうであればYesを出力し、そうでなければNoを出力します.入力された配列の任意の2つの数字が互いに異なると仮定します.
解題方法
BSTの中順序遍歴は秩序化され,後順序遍歴,最後のノードはルートノードであることを知っている.では、まずルートノードを探して、ルートノードの値を利用して、配列を2つの部分に分けて、前の部分はルートノードより小さくて左のサブツリーで、後ろの部分はルートノードより大きくて右のサブツリーです.それからそれぞれ左右の子木を遍歴すればいいです.私はこの問題をするときに左遍歴から最初のルートノードより大きい位置を見つけて左右のノードを区分し,左の部分がルートノードより小さいことを保証し,右の部分がルートノードより大きいことを保証できないので,右の部分を検証した.また,問題にはピットがあり,空木はBSTではないと考えられているため,関数を新たに定義して再帰しないと,より簡単になる.
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, nums):
if not nums: return False
return self.verifyBST(nums)
def verifyBST(self, nums):
if not nums: return True
root = nums.pop()
index = self.findIndex(nums, root)
if self.verifyRight(nums[index:], root):
left = nums[:index]
right = nums[index:]
return self.verifyBST(left) and self.verifyBST(right)
return False
def verifyRight(self, nums, target):
if not nums: return True
return min(nums) > target
def findIndex(self, nums, target):
for i, num in enumerate(nums):
if num > target:
return i
return len(nums)
Date
2018年3月20日–日差しがちょうど良く、安心して勉強