剣指offer二叉探索木の後序遍歴シーケンス(C++)
986 ワード
タイトルの説明
整数配列を入力し、その配列が二叉探索ツリーの後順に遍歴した結果であるかどうかを判断します.もしそうであればYesを出力し、そうでなければNoを出力します.入力された配列の任意の2つの数字が互いに異なると仮定します.
考え方:
二叉探索ツリーの性質:左サブツリーはルートノード値より小さく、右サブ数はルートノード値より大きい.
後順ループシーケンスの最後の値がルートノードである場合、ルートノードに基づいてシーケンスを左右のサブツリーに分けることができます.判断根拠:左サブツリーの値はいずれもルートより小さく、右サブツリーの値はいずれもルートより大きい.
解題構想:まずシーケンスを遍歴して左サブツリーを得るとbreakし,右サブツリーを判断する(右サブツリーの値がいずれもルートより大きいかどうか)
整数配列を入力し、その配列が二叉探索ツリーの後順に遍歴した結果であるかどうかを判断します.もしそうであればYesを出力し、そうでなければNoを出力します.入力された配列の任意の2つの数字が互いに異なると仮定します.
考え方:
二叉探索ツリーの性質:左サブツリーはルートノード値より小さく、右サブ数はルートノード値より大きい.
後順ループシーケンスの最後の値がルートノードである場合、ルートノードに基づいてシーケンスを左右のサブツリーに分けることができます.判断根拠:左サブツリーの値はいずれもルートより小さく、右サブツリーの値はいずれもルートより大きい.
解題構想:まずシーケンスを遍歴して左サブツリーを得るとbreakし,右サブツリーを判断する(右サブツリーの値がいずれもルートより大きいかどうか)
class Solution {
public:
bool VerifySquenceOfBST(vector sequence) {
return VSofBST(sequence,0,sequence.size()-1);
}
bool VSofBST(vector seq, int begin, int end)
{
if(seq.empty() || begin>end) return false;
int i=begin;
for(; iseq[end]) break;
}
for(int j=i; jbegin) left=VSofBST(seq, begin, i-1);
bool right = true;
if(i