题目:用二叉树实现家谱的相关运算 用二叉树实现家谱运算

\u7528\u4e8c\u53c9\u6811\u5b9e\u73b0\u5bb6\u8c31\u7684\u76f8\u5173\u8fd0\u7b97,\u6025!!!

\u6570\u636e\u7ed3\u6784\u91cc\u6811\u7684\u904d\u5386~~\u8c03\u7528\u65f6\u628a\u6839\u6539\u6210\u67d0\u4e2a\u7236\u7ed3\u70b9\u5c31\u53ef\u4ee5\u627e\u513f\u5b50\u4e86~~
\u8981\u662f\u627e\u7956\u5148\u561b~~\u6bd4\u8f83\u56f0\u96be~~\u5148\u4ece\u6839\u5f00\u59cb~~\u7528\u5c42\u6b21\u904d\u5386~~\u8bb0\u5f55\u4e0b\u8def\u5f84~~\u5c31\u53ef\u4ee5\u627e\u5230\u6240\u6709\u7956\u5148\u4e86

C++\u8bed\u8a00: \u4e8c\u53c9\u6811\u5b9e\u73b0\u7684\u7b80\u5355\u5bb6\u8c31\u6811
/*
* File Name: BiTree.cpp
* Author: Geng Lequn[[email protected]]
* Thur July 1 2010
*Discription: \u5efa\u7acb\u4e8c\u53c9\u5bb6\u8c31\u6811,\u5b9e\u73b0\u8f93\u5165\u4efb\u610f\u4e24\u4e2a\u4eba\u7684\u540d\u5b57,\u67e5\u627e\u5f97\u5230\u5176\u5173\u7cfb
*/
#include
#include
#include
#include
#include
#include
using namespace std;

typedef struct _Node
{
string sex; //\u6027\u522b m \u7537; f \u5973
string name; //\u6b64\u4eba\u7684\u59d3\u540d
string spause; //\u914d\u5076\u7684\u59d3\u540d
unsigned short level; //\u5c42\u6b21 \u8f88\u5206\u6700\u9ad8\u4e00\u5c42\u4e3a1,\u4e0b\u4e00\u5c42\u4e3a\u4e3a2,\u4ee5\u6b64\u7c7b\u63a8
struct _Node* l_child; //\u6307\u5411\u5176\u7b2c\u4e00\u4e2a\u5b69\u5b50\u7684\u6307\u9488
struct _Node* r_brother; //\u6307\u5411\u5176\u67d0\u4e00\u4e2a\u5144\u5f1f\u59d0\u59b9\u7684\u6307\u9488, \u5373\u5de6\u5b69\u5b50\u4e3a\u5176\u540e\u4ee3,\u53f3\u5b69\u5b50\u4e3a\u5176\u5144\u5f1f\u59d0\u59b9
struct _Node* btr; //\u6307\u5411\u5176\u7236\u4eb2\u6216\u8005\u6bcd\u4eb2\u7684\u6307\u9488
_Node():level(0),l_child(NULL),r_brother(NULL),btr(NULL){cout<<"constructor."<<endl;}
~_Node(){cout<<name<<" destructor."<<endl;}
}Node, *PNode;

void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth);//\u5efa\u7acb\u4e8c\u53c9\u5bb6\u8c31\u6811,\u4ee5\u5148\u5e8f\u65b9\u5f0f
void VisitBiTreePreOrder(PNode root); //\u524d\u5e8f\u904d\u5386\u6b64\u4e8c\u53c9\u6811
void TellRelation(PNode root); //\u5224\u65ad\u4e24\u4eba\u5173\u7cfb
void DestroyBiTreePostOrder(PNode root); //\u9500\u6bc1\u4e8c\u53c9\u6811,\u91ca\u653e\u8282\u70b9\u5360\u7528\u7684\u7a7a\u95f4
void FindPersonMiddleOrder(PNode root, string name, PNode &presult); //\u8fd4\u56de\u5bb6\u8c31\u4e2d\u6307\u5411\u67d0\u4eba\u7684\u6307\u9488,\u627e\u4e0d\u5230\u8fd4\u56deNULL

Node *root=NULL; //\u5168\u5c40\u53d8\u91cf,\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9
unsigned findPersonFlag = 0; //\u6807\u5fd7\u4f4d,0 \u6ca1\u627e\u5230; 1 \u627e\u5230,\u627e\u5230\u540e\u5c31\u4e0d\u518d\u641c\u7d22\u76f4\u63a5\u8fd4\u56de;\u5229\u7528\u6b64flag\u53ef\u907f\u514d\u5c06\u6574\u4e2atree\u904d\u5386\u4e00\u904d(\u82e5\u8be5name\u5728tree\u4e2d\u5b58\u5728\u7684\u8bdd)

int main()
{
cout<<"\u8bf7\u6309\u5148\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u6839\u636e\u63d0\u793a\u8f93\u5165\u5bb6\u8c31\u4fe1\u606f,\u4e0d\u5b58\u5728\u5219\u8f93\u5165\"#\""<<endl;
CreateBiTreePreOrder(root, NULL, 1);//\u5efa\u7acb\u4e8c\u53c9\u5bb6\u8c31\u6811,\u4ee5\u5148\u5e8f\u65b9\u5f0f
VisitBiTreePreOrder(root); //\u524d\u5e8f\u904d\u5386\u6b64\u4e8c\u53c9\u6811
TellRelation(root); //\u5224\u65ad\u4e24\u4eba\u5173\u7cfb
DestroyBiTreePostOrder(root); //\u9500\u6bc1\u4e8c\u53c9\u6811

getchar();getchar();getchar();
return 0;
}

/*
* function:\u5efa\u7acb\u4e8c\u53c9\u5bb6\u8c31\u6811,\u4ee5\u5148\u5e8f\u65b9\u5f0f
* argument:
* pn: \u6307\u5411\u4e8c\u53c9\u6811\u8282\u70b9\u7684\u5f15\u7528
* pback: pn\u8fd9\u4e2a\u8282\u70b9\u7684btr\u6307\u9488\u7684\u503c,\u5373\u6307\u5411\u5176parent\u7684\u6307\u9488
* depth: \u8be5\u8282\u70b9\u7684\u5c42\u6b21,\u5206\u6700\u9ad8\u4e00\u5c42\u4e3a1,\u4e0b\u4e00\u5c42\u4e3a\u4e3a2,\u4ee5\u6b64\u7c7b\u63a8
*/
void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth)
{
string str;
cin>>str; //\u8f93\u5165\u8be5\u4eba\u4fe1\u606f,\u683c\u5f0f\u662f sex-name-spausename,\u5982\u4e0d\u5b58\u5728\u5219\u8f93\u5165#
if(str == "#") //\u5982: M-tom-marry, \u8868\u793a\u6b64\u4eba\u53ebtom, \u7537\u6027, \u914d\u5076\u540d\u5b57marry
{
pn = NULL;
return;
}

//\u5982\u679c\u662f\u81ea\u5b9a\u4e49\u7684struct/class\uff0c\u5e94\u8be5\u4f7f\u7528\u6784\u9020\u51fd\u6570\u3002\u5982\u679c\u662f\u5185\u5efa\u6570\u636e\u7c7b\u578b\uff0c
//\u6bd4\u5982int\uff0c\u5e94\u8be5memset\u3002 \u5f53\u7136\uff0c\u66f4\u597d\u7684\u5efa\u8bae\u662f\u4f7f\u7528vector\u53d6\u4ee3new\u51fa\u6765\u7684\u6570\u7ec4
pn = new Node;

//\u5904\u7406\u8f93\u5165\u7684\u5b57\u7b26\u4e32
vector v;
for(size_t b=0, e=str.find('-'); ; e=str.find('-', b))
{
if(e == string::npos)
{
v.push_back(str.substr(b));
break;
}
else
v.push_back(str.substr(b, e-b));
b = e+1;
}

//\u521d\u59cb\u5316\u8be5\u8282\u70b9
pn->sex = v[0];
pn->name = v[1];
pn->spause = v[2];
pn->btr = pback;
pn->level = depth;

//\u9012\u5f52\u5efa\u7acb\u5de6\u53f3\u5b50\u6811\u7684\u8282\u70b9
CreateBiTreePreOrder(pn->l_child, pn, depth+1); //\u6ce8\u610f\u540e\u4e24\u4e2a\u53c2\u6570\u7684\u503c
CreateBiTreePreOrder(pn->r_brother, pback, depth); //\u6ce8\u610f\u540e\u4e24\u4e2a\u53c2\u6570\u7684\u503c
}

/*
* function: \u524d\u5e8f\u904d\u5386\u6b64\u4e8c\u53c9\u6811
*/
void VisitBiTreePreOrder(PNode pn)
{
if(!pn)
return;

coutsex<<endl;
coutname<<endl;
coutspause<<endl;
coutlevel<<endl;
coutbtr == NULL)?"NULL":pn->btr->name)<<endl;
cout<<"======================"<<endl;
VisitBiTreePreOrder(pn->l_child);
VisitBiTreePreOrder(pn->r_brother);
}

/*
* function: \u4e2d\u5e8f\u904d\u5386\u627e\u5230\u5bb6\u8c31\u4e2d\u7684\u4e00\u4e2a\u4eba,\u8fd4\u56de\u5176\u6307\u9488,\u82e5\u627e\u4e0d\u5230,\u8fd4\u56deNULL
* isSpause 1\u8868\u793a\u662f\u627e\u5230\u7684\u8282\u70b9\u7684\u914d\u5076 0\u8868\u793a\u4e0d\u662f\u6240\u627e\u5230\u7684\u8282\u70b9\u7684\u914d\u5076
*/
void FindPersonMiddleOrder(PNode pn, string name, PNode &presult)
{
if(!pn)
return;

FindPersonMiddleOrder(pn->l_child, name, presult);
if(findPersonFlag) return;
if(name == pn->name || name == pn->spause)
{
presult = pn;
findPersonFlag = 1; //\u5168\u5c40\u6807\u5fd7\u4f4d,0 \u6ca1\u627e\u5230; 1 \u627e\u5230,\u627e\u5230\u540e\u5c31\u4e0d\u518d\u641c\u7d22\u76f4\u63a5\u8fd4\u56de;\u5229\u7528\u6b64\u5168\u5c40flag\u53ef\u907f\u514d\u5c06\u6574\u4e2atree\u904d\u5386\u4e00\u904d(\u82e5\u8be5name\u5728tree\u4e2d\u5b58\u5728\u7684\u8bdd)
return; //\u4e0b\u6b21\u4f7f\u7528\u524d\u4e0d\u8981\u5fd8\u8bb0\u7f6e\u4e3a0
}
FindPersonMiddleOrder(pn->r_brother, name, presult);
}

/*
* function: \u5224\u65ad\u4e24\u4eba\u5173\u7cfb,\u82e5\u4e24\u4eba\u4e2d\u81f3\u5c11\u4e00\u4eba\u4e0d\u5728\u6811\u4e2d,\u5219\u4e24\u4eba\u65e0\u5173\u7cfb.
\u82e5\u4e24\u4eba\u5728\u6811\u4e2d,\u5148\u5224\u65ad\u4e24\u4eba\u662f\u5426\u540c\u5c42\u6b21,\u82e5\u540c\u5c42,\u5224\u65ad\u662f\u5426\u662f\u4eb2\u5144\u5f1f\u59d0\u59b9;
\u82e5\u4e0d\u540c\u5c42,\u8bbe\u8f88\u5206\u5927\u7684\u4eba\u4e3aA,\u8f88\u5206\u5c0f\u7684\u4eba\u4e3aB,\u5224\u65adA\u548cB\u662f\u4eb2\u7684\u8fd8\u662f\u8868\u7684,
\u6bd4\u5982,A\u4e3a\u7537\u6027,\u4e14\u6bd4B\u5927\u4e00\u500d,\u5224\u65adA\u662f\u5426\u4e3aB\u7684\u7238\u7238,\u6216\u4eb2\u53d4\u53d4(\u8205\u8205),\u6216\u8868\u53d4\u53d4(\u8205\u8205)
\u7b80\u5355\u8d77\u89c1,\u6b64\u5904\u6ca1\u6709\u533a\u5206\u662f\u53d4\u53d4\u8fd8\u662f\u8205\u8205.
\u6bd4\u5982,A\u4e3a\u7537\u6027,\u4e14\u6bd4B\u5927\u4e24\u500d,\u5224\u65adA\u662f\u5426\u4e3aB\u7684\u4eb2\u7237\u7237(\u59e5\u7237),\u6216\u4eb2\u7237\u7237(\u59e5\u7237)\u7684\u4eb2\u5144\u5f1f
,\u6216\u4eb2\u7237\u7237(\u59e5\u7237)\u7684\u8868\u5144\u5f1f
\u7b80\u5355\u8d77\u89c1,\u6b64\u5904\u6ca1\u6709\u533a\u5206\u662f\u53d4\u53d4\u548c\u8205\u8205\u7b49\u505a\u8fdb\u4e00\u6b65\u533a\u5206.
\u7b80\u5355\u8d77\u89c1,\u67e5\u8be2\u65f6\u53ea\u8f93\u5165\u8282\u70b9\u4e2d\u7684name,\u4e0d\u67e5\u8be2spause,\u5426\u5219\u5904\u7406\u8d77\u6765\u592a\u9ebb\u70e6
*/
void TellRelation(PNode pn)
{
string name1, name2;
//p1\u6307\u5411name1, p2\u6307\u5411name2, pbig\u6307\u5411\u8f88\u5206\u5927\u7684,psmall\u6307\u5411\u8f88\u5206\u5c0f\u7684
PNode p1 = NULL, p2 = NULL, pbig = NULL, psmall = NULL;
int differ = 0; //\u4e24\u4eba\u8f88\u5206\u6570\u7684\u5dee\u522b
string title;

Label:
cout<<endl<<"\u8f93\u5165\u60f3\u67e5\u8be2\u5173\u7cfb\u7684\u4e24\u4e2a\u4eba\u7684\u540d\u5b57,\u4e0d\u60f3\u67e5\u5219\u5c06\u4e24\u4eba\u540d\u5b57\u8f93\u6210#:"<<endl;
while(cin>>name1 && cin>>name2)
{
if(name1=="#" && name2=="#") return;
p1 = NULL; p2 = NULL; //\u56e0\u4e3a\u7a0b\u5e8f\u662f\u5faa\u73af\u6267\u884c\u7684,\u9700\u8981\u5c06\u4e0a\u6b21\u9057\u7559\u7684\u503c\u6e05\u6389
findPersonFlag = 0;
FindPersonMiddleOrder(root, name1, p1);
findPersonFlag = 0;
FindPersonMiddleOrder(root, name2, p2);
if(!p1 || !p2) //\u82e5\u6709\u4e00\u4e2a\u4e3a\u7a7a\u6216\u90fd\u4e3a\u7a7a,\u8bf4\u660e\u81f3\u5c11\u6709\u4e00\u4e2a\u4eba\u4e0d\u5728\u5bb6\u8c31\u4e2d,\u6545\u4e24\u4eba\u65e0\u4eb2\u7f18\u5173\u7cfb
{
cout<<name1<<((!p1)?" \u4e0d\u5728":" \u5728")<<" \u5bb6\u8c31\u6811\u4e2d."<<endl;
cout<<name2<<((!p2)?" \u4e0d\u5728":" \u5728")<<" \u5bb6\u8c31\u6811\u4e2d."<<endl;
cout<<name1<<" \u548c "<<name2<<" \u95f4\u6ca1\u6709\u5173\u7cfb."<<endl<<endl;
goto Label;
}
differ = (int)abs(p1->level - p2->level);
if(!differ) //\u8f88\u5206\u4e00\u6837\u5927
{
if(p1->sex == p2->sex)
{
if(p1->sex == "M") title = "\u5144\u5f1f\u5173\u7cfb";
else title = "\u59d0\u59b9\u5173\u7cfb";
}
else title = "\u5144\u59b9(\u59d0\u5f1f)\u5173\u7cfb.";
if(p1->btr == p2->btr) //parent\u76f8\u540c
cout<<name1<<" \u548c "<<name2<<" \u95f4\u662f "<<" \u4eb2 "<<title<<endl;
else
cout<<name1<<" \u548c "<<name2<<" \u95f4\u662f "<<" \u8868 "<<title<<endl;
}
else //\u8f88\u5206\u4e0d\u4e00\u6837\u5927
{
if(p1->level level) {pbig = p1; psmall = p2;}
else {pbig = p2; psmall = p1;}
switch(differ)
{
case 1:
if(psmall->btr == pbig)
title = ((pbig->sex == "M")?"\u7238\u7238.":"\u5988\u5988.");
else
{
if(psmall->btr->btr == pbig->btr)
title = ((pbig->sex == "M")?"\u4eb2\u53d4(\u8205).":"\u4eb2\u59d1(\u59e8).");
else
title = ((pbig->sex == "M")?"\u8868\u53d4(\u8205).":"\u8868\u59d1(\u59e8).");
}
break;
case 2:
if(psmall->btr->btr == pbig)
title = ((pbig->sex == "M")?"\u7237\u7237(\u59e5\u7237).":"\u5976\u5976(\u59e5\u59e5).");
else
{
string tmp = ((pbig->sex == "M")?"\u5144\u5f1f.":"\u59d0\u59b9.");
if(psmall->btr->btr->btr == pbig->btr)
title = ((psmall->btr->btr->sex == "M")?"\u7237\u7237(\u59e5\u7237)\u7684\u4eb2":"\u5976\u5976(\u59e5\u59e5)\u7684\u4eb2") + tmp;
else
title = ((psmall->btr->btr->sex == "M")?"\u7237\u7237(\u59e5\u7237)\u7684\u8868":"\u5976\u5976(\u59e5\u59e5)\u7684\u8868") + tmp;
}
break;
default:
string tmp2;
PNode pt = psmall;
int n = differ-2; //\u8ba1\u7b97"\u8001"\u5b57 (\u5373grand\u8fd9\u4e2a\u5b57) \u51fa\u73b0\u7684\u4e2a\u6570
for(int i=0; i<n; ++i)
tmp2 += "\u8001";

for(int i=0; i<differ; ++i)
pt = pt->btr;
if(pt == pbig)
title = tmp2 + ((pbig->sex == "M")?"\u7237\u7237(\u59e5\u7237).":"\u5976\u5976(\u59e5\u59e5).");
else
{
string tmp3 = ((pbig->sex == "M")?"\u5144\u5f1f.":"\u59d0\u59b9.");
if(pt->btr == pbig->btr)
{title = tmp2 + ((pt->sex == "M")?"\u7237\u7237(\u59e5\u7237)\u7684\u4eb2":"\u5976\u5976(\u59e5\u59e5)\u7684\u4eb2"); title+=tmp3;}
else
{title = tmp2 + ((pt->sex == "M")?"\u7237\u7237(\u59e5\u7237)\u7684\u8868":"\u5976\u5976(\u59e5\u59e5)\u7684\u8868"); title+=tmp3;}
}
break;
}
coutnamename<<" \u7684 "<<title<<endl;
}
goto Label;
}
}

/*
* function: \u540e\u5e8f\u904d\u5386\u9500\u6bc1\u6b64\u4e8c\u53c9\u6811,\u91ca\u653e\u8282\u70b9\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4
*/
void DestroyBiTreePostOrder(PNode pn)
{
if(!pn) return;
DestroyBiTreePostOrder(pn->l_child);
DestroyBiTreePostOrder(pn->r_brother);
delete pn;
}

/*实验14—2 设计一个程序,采用二叉树表示一个家谱关系。要求程序具有如下功能:
(1) 文件操作功能:记录输入、记录输出,清除全部文件记录和将家谱记录存盘。
(2) 家谱操作功能:用括号表示法输出家谱二叉树,查找某人所有的儿子,查找某人所有的祖先。*/

#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

typedef struct Node
{
int degree;//人员所在代数
char data;//人员标志
struct Node *lchild;//data的孩子
struct Node *rchild;//data的兄弟
}BTNode;

#define max 100
int choose;
char X;

void CreatBTNode(BTNode **b,char *str);//创建记录
BTNode* SearchX(BTNode *b,char X);//查找记录
void InputBTNode(BTNode **b,char *str);//1.记录输入
void OutputBTNode(BTNode **b,char *str);//2.记录输出
void Store(BTNode *b,char *str);//3.家谱记录存盘
void DispTree(BTNode *b);//4.用括号法输出家谱
void SearchXSon(BTNode *b,char X);//5.查找某人的儿子
void SearchXAncestor(BTNode *b,char X);//6.查找某人的祖先
void Distory(BTNode **b,char *str);//7.清除全部文件记录

int main()
{BTNode *b=NULL;
char *str=(char*)malloc(max*sizeof(char));
str[0]='\0';
cout<<"--------------------------------------------------------------------"<<endl;
cout<<"0.退出"<<endl;
cout<<"1.记录输入:\t"<<endl;
cout<<"2.记录输出:\t"<<endl;
cout<<"3.家谱记录存盘:\t"<<endl;
cout<<"4.用括号法输出家谱:\t"<<endl;
cout<<"5.查找某人的儿子:\t"<<endl;
cout<<"6.查找某人的祖先:\t"<<endl;
cout<<"7.清除全部文件记录:\n"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
cout<<"Please choose the operation you want to do. "<<endl;
cout<<"choose=";
cin>>choose;
while(choose)
{switch(choose)
{
case 1:
InputBTNode(&b,str);break;
case 2:
OutputBTNode(&b,str);break;
case 3:
Store(b,str);
printf("文件已经保存!");
break;
case 4:
DispTree(b); break;
case 5:
printf("请输入需要查找儿子的结点:");
cin>>X;
SearchXSon(b,X);
break;
case 6:
printf("请输入需要查找祖先的结点:\n");
cin>>X;
BTNode *p;
p=SearchX(b,X);
if(p!=NULL)
SearchXAncestor(b,X);
else
printf("该结点不存在!");
break;
case 7:
Distory(&b,str);
printf("文件记录已经清除!");
break;
default:
cout<<endl<<"Invalid input,input again.";
}
cout<<endl<<"please choose again:"<<endl;
cout<<"the choose =";
cin>>choose;
}
return 0;
}

void CreatBTNode(BTNode **b,char *str) //创建树
{

BTNode *S[max],*p=NULL;
int top=-1,tag,j=0,d=0;
char ch;
*b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':
d++;
top++;
S[top]=p;
tag=1;break;
case ')':
top--;break;
case ',':
d--;
tag=2;break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->degree=d;
p->data=ch;
p->lchild=NULL;
p->rchild=NULL;
if((*b)==NULL)(*b)=p;
else
{
switch(tag)
{
case 1: S[top]->lchild=p;break;
case 2: S[top]->rchild=p;break;
}
}
}
ch=str[++j];
}
}

void InputBTNode(BTNode **b,char *str)//记录输入
{
do
{
printf("请输入需要输入的记录:\n");
gets(str);
if(str[0]=='\0')
printf("输入的记录为空,请再次输入:\n");
}while(str[0]=='\0');
CreatBTNode(b,str);
printf("记录创建成功!");
}

void OutputBTNode(BTNode **b,char *str)//从文件中读出记录
{
FILE *fp;
if((fp=fopen("wanglj.txt","r"))==NULL)
{
printf("不存在记录文件,要建立吗?\n建立请输入Y,否则按其他键:");
if(getchar()=='Y')
{
fp=fopen("wanglj.txt","w+");
printf("记录文件“wanglj.txt”已建立\n");
}
else
exit(1);
}
else
{
if(!feof(fp))
fscanf(fp,"%s",str);
fclose(fp);
CreatBTNode(b,str);
printf("文件中记录已输出\n");
}

}

void Store(BTNode *b,char *str)//储存全部的结点记录
{
BTNode *p;
p=b;
FILE *fp;
fp=fopen("wanglj.txt","w+");
if(fp==NULL)
{
printf("文件打开失败!");
return;
}
else
{
if(p!=NULL)
{
fprintf(fp,"%s",str);
fclose(fp);
}
}
}

void DispTree(BTNode *b)//用括号法输出家谱记录
{
if(b!=NULL)
{printf("%c",b->data);
if(b->lchild!=NULL||b->rchild!=NULL)
{printf("(");
DispTree(b->lchild);
if(b->rchild!=NULL)
{printf(",");
DispTree(b->rchild);
}
printf(")");
}
}
else
printf("\0");
}

BTNode* SearchX(BTNode *b,char X)//查找结点X
{BTNode *p;
if(b==NULL) return NULL;
else if(b->data==X) return b;
else
{
p=SearchX(b->lchild,X);
if(p!=NULL) return p;
else
{
return SearchX(b->rchild,X);
}
}
}

void SearchXSon(BTNode *b,char X)//查找结点X的所有儿子
{
BTNode *p,*q;
p=SearchX(b,X); //找到节点X
if(p!=NULL)
{
p=p->lchild;
if(p==NULL) //X没有孩子
printf("节点%c没有儿子!",X);
else
{
printf("节点%c的所有儿子为:",X);
if(p!=NULL)
printf("%c ",p->data);
q=p->rchild;
while(q)
{
printf("%c ",q->data);
q=q->rchild;
}
}
}
else
printf("该结点不存在!");
}

void TraverseBT(BTNode *b,int d)//遍历家谱
{
if(b!=NULL)
if(b->degree<d)
{
printf("%c ",b->data);
if(b->lchild!=NULL)
TraverseBT(b->lchild,d);
if(b->rchild!=NULL)
TraverseBT(b->rchild,d);
}
}

void SearchXAncestor(BTNode *b,char X)//查找结点X的所有祖先
{
if(b==NULL)
{
printf("这是一棵空树!");
return ;
}
BTNode *p=SearchX(b,X);
if(p->degree==0)
{
printf("X为根节点或其兄弟,没有祖先!");
return;
}
printf("%c结点的祖先有:",X);
TraverseBT(b,p->degree);
}

void Distory(BTNode **b,char *str)//清除全部的记录
{
(*b)=NULL;
FILE *fp;
fp=fopen("wanglj.txt","w");
if(fp==NULL)
{
printf("打开文件失败!");
exit(1);
}
str="";
fclose(fp);
}

你懂的,同道中人!

  • 椤哄簭瀛樺偍琛ㄧず娉曚负浠涔堜笉鏄爲鐨勫瓨鍌ㄥ舰寮
    绛旓細瀵逛簬涓鑸殑瀹惰氨鏍(涓鑸殑澶氬弶鏍)鏉ヨ锛屾垜浠彲浠ュ緢娓呮鐨勭湅鍑哄眰娆″叧绯伙紝鏍戠殑灞傛暟琛ㄧず浠f暟锛堜竴鍏卞灏戜唬浜猴級锛屾爲鐨勬渶鍚庝竴灞傝〃绀烘渶鍚庝竴浠d汉锛岀敱浜庡鍙夐摼琛ㄦ硶琛ㄧず鐨勪笉鏂逛究锛屽洜姝よ杩棤濂堥噰鐢ㄥ瀛愬厔寮熻〃绀烘硶(浜屽弶閾捐〃娉)銆傜粨鏋 浜屽弶鏍戠殑椤哄簭瀛樺偍灏辨槸鐢ㄤ竴缁勮繛缁殑瀛樺偍鍗曞厓瀛樻斁浜屽張鏍戜腑鐨勭粨鐐瑰厓绱狅紝涓鑸寜鐓т簩鍙...
  • 涓鏂囧甫浣犺璇30涓噸瑕佺殑鏁版嵁缁撴瀯鍜岀畻娉
    绛旓細瀹冧滑鏄仛浠涔堢敤鐨勶紵鎴戜滑鍦ㄤ换浣曢渶瑕佹弿缁樺眰娆$粨鏋勭殑鏃跺欓兘浣跨敤鏍銆傛垜浠嚜宸辩殑瀹惰氨鏍灏辨槸涓涓畬缇庣殑渚嬪瓙銆備綘鏈鍙よ佺殑绁栧厛鏄爲鐨勬牴銆傛渶骞磋交鐨勪竴浠d唬琛ㄥ彾瀛愮殑闆嗗悎銆傛爲涔熷彲浠ヤ唬琛ㄤ綘宸ヤ綔鐨勫叕鍙镐腑鐨勪笂涓嬬骇鍏崇郴銆傝繖鏍锋偍灏卞彲浠ユ壘鍑鸿皝鏄偍鐨勪笂绾т互鍙婃偍搴旇绠$悊璋併傜壒鎬 浜屽弶鏍鏄竴绉嶇壒娈婄被鍨嬬殑鏍戯細姣忎釜椤剁偣鏈澶氬彲浠...
  • 绂绘暎鏁板鍦ㄥ叿浣撻鍩熺殑搴旂敤
    绛旓細绂绘暎鏁板鍦ㄦ暟鎹粨鏋勪腑鐨勫簲鐢ㄤ富瑕佹槸鍥捐閮ㄥ垎鍦ㄦ暟鎹粨鏋勪腑鐨勫簲鐢,鏍戝湪鍥捐涓崰鐫閲嶈鐨勫湴浣嶃傛爲鏄竴绉嶉潪绾挎ф暟鎹粨鏋,鍦ㄧ幇瀹炵敓娲讳腑鍙互鐢ㄦ爲鏉ヨ〃绀烘煇涓瀹舵棌鐨瀹惰氨鎴栨煇鍏徃鐨勭粍缁囩粨鏋,涔熷彲浠ョ敤瀹冩潵琛ㄧず璁$畻鏈轰腑鏂囦欢鐨勭粍缁囩粨鏋,鏍戜腑浜屽弶鏍鍦ㄨ绠楁満绉戝涓湁鐫閲嶈鐨勫簲鐢ㄣ備簩鍙夋爲鍏辨湁涓夌閬嶅巻鏂规硶:鍓嶅簭閬嶅巻娉曘...
  • 姹囩紪璇█绋嬪簭璁捐(浠婚変袱閬撻)
    绛旓細鎴戞湁涓垚缁╃粺璁$▼搴忕殑璁捐 闇瑕佺殑璇濇壘銆78219960銆
  • C璇█璇剧▼璁捐
    绛旓細浠ヤ笅绋嬪簭宸插湪win-tc鍜宼c2.0涓嬭繍琛岄氳繃锛屽凡鍔犺缁嗘敞閲(鏈汉鎵鍐)銆/* 鏁版嵁瀹夊叏瀹炵敤绋嬪簭锛屽姞瀵嗚В瀵嗙畝鍗曠▼搴 */ include<stdio.h> include<stdlib.h> include<conio.h> int flag;char encrypt(char ch,int key)/*鍔犲瘑鍑芥暟锛屾妸瀛楃寰幆绉讳綅*/ { if(ch>='a' && ch<='z') /* 濡傛灉鏄皬鍐...
  • tree(3)杩欎釜鏁版湁澶氬ぇ?
    绛旓細濡傛灉浣犱笉鏄绠楁満涓撲笟鐨勶紝涔熶笉瑕佺揣銆備綘搴旇涔熺湅鍒拌繃鍏徃鐨勭粍缁囨灦鏋勫浘锛屾垨鏄煇涓汉鐨瀹惰氨绛夌瓑锛屼篃鏄敤绫讳技涓妫鏍戠殑缁撴瀯灞曠ず鐨勶紝杩欏氨鏄垜浠粖澶╄璋堢殑鏍戠殑姒傚康銆傛垜鍦ㄨ妭鐩粙缁嶉噷涔熸斁浜嗕竴涓爲鐨勭畝鍗曠ず鎰忓浘銆傜劧鍚嶵REE(3)杩欎釜鏁帮紝灏卞彲浠ョ敤涓绉嶇敾鏍戠殑娓告垙鏉ュ鍑猴紝鐢荤殑鏃跺欙紝鎴戜滑浼氱粰姣忎釜鑺傜偣锛屼織绉板彾瀛愮殑...
  • C璇█涓嚱鏁板弬鏁伴噷闈㈡寚閽堝悗闈㈠姞浜&?
    绛旓細鍔&璇存槑鍑芥暟鍙傛暟鏄紩鐢ㄧ被鍨嬶紝鍗冲舰鍙傛槸瀹炲弬鐨勪竴涓埆鍚嶃傚嚱鏁颁腑鎵鏈変娇鐢ㄥ舰鍙傜殑鍦版柟锛屽氨鐩稿綋浜庡湪鐩存帴浣跨敤瀹炲弬鏈韩銆
  • 鍚湁[tr]闊虫爣鍙戦煶鐨勮嫳璇崟璇嶆湁鍝簺?
    绛旓細n. 鏍戯紱鏈ㄦ枡锛涙爲鐘剁墿 vt. 鎶...璧朵笂鏍 vi. 鐖笂鏍戯紱閫冧笂鏍 鐭 family tree 瀹舵棌鏍 ; 瀹惰氨 ; 瀹跺涵鏍 ; 鏃忚氨 binary tree[璁浜屽弶鏍 ; 浜 ; 浜岃繘鍒舵爲 5銆乼rain n. 鐏溅锛涜鍒楋紱闀块槦锛涜瑁 v. 鍩瑰吇锛涜缁冿紱鐬勫噯 鐭 Express train 蹇熷垪杞 ; 蹇溅 ; 鐗瑰揩鍒楄溅 Strangers on a ...
  • TREE鏄粈涔堟剰鎬?
    绛旓細tree 鑻 [tri:] 缇 [tri] 锛歯. 鏍;鏈ㄦ枡;鏍戠姸鍥;瀹楄氨锛泇t. 鎶?璧朵笂鏍;浣垮浜庡洶澧;鎶婇瀷鍨嬫彃鍏ワ紙闉嬪唴锛夌煭璇 family tree 瀹舵棌鏍 ; 瀹惰氨 ; 瀹跺涵鏍 ; 鏃忚氨 Suffix Tree [璁 鍚庣紑鏍 ; 鍚庣紑鏍戝疄鐜 ; 瀛楀熬鏍 tree hyrax 鏍戣箘鍏斿睘 ; 鏍戣箘鍏 Leftist tree 宸﹀亸鏍 ; 宸﹀炬爲 Tree ...
  • 鏍戣嫳璇庝箞璇
    绛旓細妞嶇墿瀛 鑻卞浗锛岀編娲诧紝TNI 妞嶇墿瀛︼紱鍖哄煙妞嶇墿鍚嶇О 鐭 妞嶇墿瀛︽枩绾圭粐鐗 妞嶇墿瀛oil Bottani鐭彂 妞嶇墿绠辩粏缇婃瘺閽堟⒊鐞嗘満 鐗圭妞嶇墿瀛︼紱鐗圭妞嶇墿瀛 渚嬪彞 妞嶇墿瀛︽槸瀵规鐗╃殑鐮旂┒銆傛鐗╁鏄妞嶇墿鐨勭爺绌躲傛垜浠庢鐗╁璇句笂鐩存帴鍘讳笂閭i棬璇撅紝杩欏鎴戠悊瑙d换浣曚竴闂ㄥ绉戦兘娌℃湁甯姪銆傛鐗╁璇惧悗锛屾垜鐩存帴涓婁簡缁忔祹瀛﹁锛屼絾...
  • 扩展阅读:一秒拍照答题免费 ... 免费扫题出答案 ... 安全试题扫一扫出答案 ... 扫一扫做题 ... 扫一扫数学题目出答案 ... 一扫出答案 ... 2024年保密观25道题 ... 免费扫一扫找答案 ... 免费拍照答题神器 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网