[Java] 331.バイナリツリーの事前注文のシリアル化を確認します---アイデアをすばやく理解し、問題を解決します。!!

二分木をシリアル化する1つの方法は、プレオーダートラバーサルを使用することです。空でないノードに遭遇した場合、このノードの値を記録できます。空のノードの場合は、#などのタグ値レコードを使用できます。

    _9_
    /   \
   3     2
  / \   / \
 4   1  #  6
/ \ / \   / \
# # # #   # #

たとえば、上記の二分木は文字列「9,3,4、#、#、1、#、#、2、#、6、#、#」にシリアル化できます。ここで、#は空のノードを表します。

カンマ区切りのシーケンスを指定して、それがバイナリツリーの正しいプレオーダーシリアル化であることを確認します。ツリーを再構築せずに実行可能なアルゴリズムを記述します。

コンマで区切られた各文字は、整数またはNULLポインターを表す「#」のいずれかです。

入力形式は常に有効であると考えることができます。たとえば、「1,3」のように2つの連続したコンマが含まれることはありません。

例1:

入力: "9,3,4、#、#、1、#、#、2、#、6、#、#"
出力:true
設計アイデア:1次キューはルートノード、左側ノード、および右ノードループトラバーサル。各ノードには左ノードと右ノード(+2)があり、ルートノードまたは左ノードまたは右ノード(-1)とも呼ばれます。

代码:
public static boolean isValidSerialization(String preorder) {
    
    
		 String[]a=preorder.split(",");
		 if(a[0].equals("#")&&a.length==1) {
    
    
			 return true;
		 }
		 if(a[0].equals("#")&&a.length!=1) {
    
    
			 return false;
		 }
         int count=1;//记录结点未知的叶子节点数
         for(int i=0;i<a.length;i++){
    
    
              count--;
              if(count<0) {
    
    
            	  return false;
              }
              if(!a[i].equals("#")) {
    
    
            	  count+=2;
              }
         }
		return count==0;
    }

おすすめ

転載: blog.csdn.net/qq_44461217/article/details/114689364