バイナリツリーノードのパス

/// C言語

///指示に従ってバイナリツリーを入力し、ノードを入力します

///ルートからノードへのパスを取得できます

///私のプログラミング基盤は貧弱で不器用です。許してください
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
  {
   TElemType data;
   struct BiTNode * lchild、* rchild;
   int flag; // /自家製ロゴ1 || 0
  } BiTNode、* BiTree、* bitree;

typedef bitree SElemType;

typedef struct {// sequence stack
   SElemType * base;
   SElemType * top;
   int StackSize; //現在割り当てられているスタックのストレージスペース

  } SqStack;

SqStack s、w; // wはストレージパスに使用されます

  //最初にバイナリツリーを構築します
BiTree CreateTree()
  {
   char ch;
   BiTree T;
   scanf( "%c"、&ch);
   if(ch == '#')T = NULL;
   else
   {
     T =(BiTree)malloc(sizeof (BiTNode));
     T-> data = ch;
     T-> flag = 1; // 1はアクセスされなかったことを意味します
     T-> lchild = CreateTree();
     T-> rchild = CreateTree();
   }
   return T; //ルートノードに戻る
  }

int InitStack(SqStack&S)//シーケンシャルスタックの初期MOOC
  {//空のスタックを構築S
   S.base =(SElemType *)malloc(100 * sizeof(SElemType));
   if(NULL == S.base)exit( -1); //ストレージの割り当てに失敗しました
   //if(NULL==S.base)exit(OVERFLOW); //ストレージの割り当てに失敗しました、教師Huは
   S.top = S.base; //トップは最初はベース
   SですStackSize = 10;
   return 1;
  }

int Push(SqStack&S、SElemType e)
//スタックの新しい最上位要素としてeを挿入し、スタックスペースが十分でない場合は、自動的に展開します(realloc関数)
  {
   if(S.top-S.base> = S.StackSize)
    {
     S. base =(SElemType *)realloc(S.base、(S.StackSize + 10)* sizeof(SElemType));
     if(!S.base)return -1; //ストレージの割り当てに失敗しました
     S.top = S.base + S.StackSize;
     S.StackSize + = 10;
    }
   * S.top ++ = e; //要素eがスタックの最上部にプッシュされ、スタック最上部のポインタが1増加します//スタック最上部の要素は保存されません
   return 1;
  }

int GetTop(SqStack S、SElemType&e)
{//
(S.top == S.base)return -1;の場合、eを使用してSの最上位の要素を返します; //空のスタック
e = *(S.top-1);
return 1;
}

int Pop(SqStack&S、SElemType&e)//
スタックを削除してスタックの最上位要素を削除{// Sの最上位要素を削除し、eでその値を返す
if(S.top == S.base)return -1;
e = * -S.top; //スタックの一番上のポインタを1減らし、一番上の要素をeに割り当てます//スタックの一番上の要素は
1を返しません;
}

 

int Search2(bitree t、char&x、SqStack&w)//パス
  {
   bitree p = t、q = NULL、v;
   p-> flag = 0; // 0は、アクセスされたことを意味します
   Push(w、p);
   while( 1)//スタックは空ではない
     {
      if(p-> data == x)// Find
       {
        break;
       }
        else if(p-> lchild!= NULL && p-> lchild-> flag!= 0)//左
       {
         p -> lchild-> flag = 0; // 0はアクセスされたことを意味します
         Push(w、p-> lchild);
         p = p-> lchild;
       }
      else if((p-> lchild == NULL | p-> lchild->フラグ== 0)
                   && p-> rchild!= NULL)//
       {
        p-> rchild->フラグ= 0; // 0はアクセスされたことを意味します
          Push(w、p-> rchild);
         p = p-> rchild;
         }
        else if(p-> lchild == NULL && p-> rchild == NULL)//叶子结点
         {
            Pop(w、q);
            GetTop(w、q);
            p = q;
         }
        else
         {
          Pop(w、v);
           GetTop(w、q);
          p = q;
          }
      }
   }

  }   0を返します。 }




























 

///ようこそ斧と提案!

おすすめ

転載: www.cnblogs.com/Alic5/p/12711787.html