/// 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を返します。 }
///ようこそ斧と提案!