对广义表的链表表示的深度优先遍历的实现要点是,从广义表的附加头节点开始向后顺序访问,对原子节点,访问结束后递进至下一节点,每遇到子表的附加头节点就进入该子表所在的下一层继续向下遍历,在下一层的子表中同样也是访问并经过原子节点,一遇到子表附加头节点就立即向下进入子表继续遍历,就这样不断向下遍历,最终进入空表或没有子表的非空表并遍历完成后就立即回溯至上一层子表并按照上述规则继续向后遍历,子表遍历完成就再回溯至上上层子表,然后继续遍历,就这样反复不断地回溯和向下遍历,直到最后一次回溯至原广义表并向后完成遍历后整个广义表的深度优先遍历也就结束了。

利用广义表的深度优先遍历可以完成诸多有实用价值的运算,如:找出所有子表及对应的深度,长度,在广义表中的位置;求出子表数目;找出最长最短子表,深度最深子表;找出所有空表的深度,位置,数目;在广义表中搜索给定关键字,找出包含关键字的所有子表及其在子表中的位置;找出所有空表以及不包含子表的子表;确定各个子表左右括号的起始终止位置以及序数;找出给定深度的所有子表等等。下面就来讨论以上部分运算的实现:

(1)找出所有子表及对应的深度,长度,在广义表中的位置和子表的数目

用栈实现,栈节点保存子表附加头节点的指针,及已统计到的子表表元素数目。遍历过程中每遇到子表附加头节点就把子表对应栈节点入栈,遍历完子表后将对应栈节点出栈,遇到原子项将原子项所在子表的栈节点的表元素计数变量加一,遇到下一层子表的附加头节点也要将本层子表的栈节点计数变量加一。最后遍历完广义表后栈中只剩下广义表本身对应的栈节点,取出其中指针赋予指针变量使其指向广义表附加头节点,然后出栈,就完成了遍历。遍历过程中需要使用指针变量指向并访问广义表各个链表节点,指针的动作方式和深度优先遍历要点所述是一致的,指针从子表表尾继续前进时会成为空指针,此时就遍历完子表,栈顶节点的计数变量就是子表长度,栈大小就是子表深度,栈中节点序列指出了子表在广义表中的位置,栈顶节点指针就是指向子表附加头节点的指针,利用该指针可输出子表。至于子表数目用计数变量进行简单统计就可以得到。具体C++代码实现如下(本文所有代码在visual studio 2017编译环境下调试通过):

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;struct Gen          //广义表链表表示的节点结构体类型
{int utype;     //节点类型,0表示广义表附加头结点,1表示子表附加头结点,2表示原子数据项union{int ref;         //联合体类型,utype==0时ref为引用计数,==1时hlink为指向子表第一个节点指针,==2时value为原子项的数据值struct Gen *hlink;char value;}info;           //联合体变量infostruct Gen *tlink;    //指向该节点所在链表下一节点的指针Gen(int u);Gen(int u, char v);    //构造函数声明
};
Gen::Gen(int u) :utype(u), tlink(nullptr)    //utype=0或1时初始化节点
{if (u == 0)info.ref = 0;elseinfo.hlink = nullptr;
}Gen::Gen(int u, char v) :utype(u), tlink(nullptr)   //utype==2,value==v时初始化节点
{info.value = v;
}class Gennode        //深度优先遍历广义表链表表示时辅助遍历过程的类型
{
public:int numnode;   //子表中当前已统计的节点数,遍历完子表后即为子表长度Gen *ptr;      //指向子表附加头节点的指针Gennode(Gen *p) :ptr(p), numnode(0) {}  //初始化
};void output(vector<Gennode> &stack);   //输出stack栈中存放的子表位置信息
void suboutput(Gen *head);     //输出head指向的子表
Gen * strtogen();   //将字符串形式的广义表转换为链表表示int main()
{int depth = 0; int maxdepth = 0;  //子表深度,最大深度初始化int flag = 0; int sign = 0;   //flag用于在找到子表后标志当前子表是非空表,非空子表还是为空的广义表本身,sign标志当前子表是否还有子表,0没有1有int subcount = 0;    //子表计数int emptycount = 0;  //空表计数bool TF = true;      //true递进至新的一层,false从上一层回溯至本层vector<Gennode> stack;  //辅助遍历过程的栈Gen *ptr=strtogen();//ptr初始化为指向广义表附加头节点的指针while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1))  //ptr指向广义表或子表附加头节点{if (TF == true)  //新进至本层{sign = 0;depth++;if (ptr->utype == 0)  //从广义表附加头节点开始{Gennode temp(ptr);stack.push_back(temp);  //附加头节点指针入栈flag = 0;ptr = ptr->tlink;  //ptr递进至下一节点}else  //到达本层子表附加头节点{++stack[stack.size() - 1].numnode; //子表为表元素,所以将本层子表的已统计节点数加一  Gennode temp(ptr);stack.push_back(temp);   //子表附加头节点入栈flag = 2;ptr = ptr->info.hlink;   //递进至子表第一个表元素}}else{if (ptr->utype == 0)   //ptr指针回溯至广义表附加头节点,遍历完成退出break;else   //从子表回溯至本层上该子表的附加头节点{sign = 1;ptr = ptr->tlink;  //继续递进至本层下一下一节点flag = 1;TF = true;}}}else{if (ptr == nullptr)   //找到一个子表{subcount++;if (flag == 2) //找到一个子空表{emptycount++;cout << "第" << subcount << "个子表,为空表:()"<<endl;   //输出子表信息cout << "深度:" << depth << " 长度:" << 0 << endl;cout << "位置:" << endl;output(stack);    //栈中存有完整位置信息,输出}else{if (flag == 1){//找到一个非空子表cout << "第" << subcount << "个非空子表:";suboutput(stack[stack.size() - 1].ptr);//输出该子表cout << "深度:" << depth << " 长度:" << stack[stack.size() - 1].numnode << endl;cout << "位置:" << endl;if (stack[stack.size() - 1].ptr->utype == 0){//当前非空子表为广义表本身,cout << "该非空子表为广义表本身"<<endl;}else{//当前非空子表为真子表,栈中存有完整位置信息,输出output(stack);}}else{emptycount++;//找到子空表,即为广义表本身,输出之cout << "第" << subcount << "个子表,为空表:()" << endl;cout << "深度:" << depth << " 长度:" << 0 << endl;cout << "位置:" << endl;cout << "该子空表为广义表本身" << endl;}}if (sign == 0)  //该子表为空表或没有子表的子表{if (depth > maxdepth)maxdepth = depth;  //比较确定最大深度}depth--;ptr = stack[stack.size() - 1].ptr;  //ptr回溯至上一层stack.pop_back();TF = false;}else   //找到本层的一个原子数据项{++stack[stack.size() - 1].numnode;  //本层子表节点计数加一ptr = ptr->tlink;  //ptr向后递进flag = 1;}}}cout << "共有" << subcount << "个子表,其中有" << emptycount << "个空表" << endl;  //输出子表数目,空表数目,广义表深度cout << "广义表深度:"<< maxdepth<<endl;return 0;
}void output(vector<Gennode> &stack)
{for (auto i = stack.begin(); i != stack.end() - 1; ++i)  //遍历stack栈输出子表位置信息{if (i == stack.begin()){cout << "广义表的第" << (*i).numnode << "个表元素";}else{cout << "的第" << (*i).numnode << "个表元素";}}cout << endl;
}void suboutput(Gen *head)
{Gen *ptr = head;bool TF = true;vector<Gen *> stack;while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1))  //注意{if (TF == true){stack.push_back(ptr);cout << "(";if (ptr->utype == 0)   //注意{ptr = ptr->tlink;}else{ptr = ptr->info.hlink;}}else{if (ptr == head)break;else{ptr = ptr->tlink;TF = true;}}}else{if (ptr == nullptr){cout << ")";ptr = stack[stack.size() - 1];if (ptr->utype != 0 && ptr->tlink != nullptr)    //注意cout << ",";stack.pop_back();TF = false;}else{cout << ptr->info.value;ptr = ptr->tlink;if (ptr != nullptr)cout << ",";}}}cout << endl;
}Gen * strtogen()
{string glist;cout << "请输入广义表的字符串形式" << endl;cin >> glist;Gen *ptr = nullptr; vector<Gen *> stack; bool TF;for (auto i = glist.cbegin(); i != glist.cend(); ++i){if (*i == '('){if (i == glist.cbegin()){ptr = new Gen(0);stack.push_back(ptr);TF = true;}else{Gen *temp = new Gen(1);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}stack.push_back(temp);TF = true;ptr = temp;}}else{if (*i == ')'){ptr = stack[stack.size() - 1];stack.pop_back();TF = false;}else{if (*i != ','){Gen *temp = new Gen(2, *i);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}ptr = temp;}}}}return ptr;
}

运行示例:

以上代码调用了两个函数suboutput和strtogen,分别用来输出广义表链表表示对应的字符串表示和将字符串形式的广义表转化为链表表示

(2)在广义表中搜索给定关键字,找出包含关键字的所有子表及其在子表中的位置:
这里需要在Gennode类型中新增一个vector对象position用来存放关键字在子表中的位置,每在子表中找到一个关键字就要把其位置存入position尾端。遍历子表后根据position是否为空可断定子表是否含关键字,不为空的话顺序输出关键字位置即可

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;struct Gen
{int utype;union{int ref;struct Gen *hlink;char value;}info;struct Gen *tlink;Gen(int u);Gen(int u, char v);
};
Gen::Gen(int u) :utype(u), tlink(nullptr)
{if (u == 0)info.ref = 0;elseinfo.hlink = nullptr;
}Gen::Gen(int u, char v) :utype(u), tlink(nullptr)
{info.value = v;
}class Gennode
{
public:int numnode;Gen *ptr;vector<int> position;Gennode(Gen *p) :ptr(p), numnode(0) {}
};void output(vector<Gennode> &stack);
void suboutput(Gen *head);
Gen * strtogen();int main()
{int depth = 0; int flag = 0; int subcount = 0;    //含指定值的子表计数bool TF = true;char key;    //待搜索的关键字vector<Gennode> stack;Gen *ptr= strtogen();//ptr初始化为指向广义表附加头节点的指针cout << "请输入要搜索的值:" << endl;   //输入要搜索的关键字cin >> key;while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1)){if (TF == true){depth++;if (ptr->utype == 0){Gennode temp(ptr);stack.push_back(temp);flag = 0;ptr = ptr->tlink;}else{++stack[stack.size() - 1].numnode;Gennode temp(ptr);stack.push_back(temp);flag = 2;ptr = ptr->info.hlink;}}else{if (ptr->utype == 0)   //搜索完毕退出break;else{ptr = ptr->tlink;flag = 1;TF = true;}}}else{if (ptr == nullptr){if (flag != 2 && flag!=0)   //当前找到的子表非空,这样才可能包含关键字{if (stack[stack.size() - 1].position.size()!=0)  //当前非空子表包含关键字{subcount++;   cout << "第" << subcount << "个含" << key << "的非空子表:";suboutput(stack[stack.size() - 1].ptr);//输出含关键字的非空子表cout << key << "是其中第";   //输出关键字在非空子表中的位置for (auto i = stack[stack.size() - 1].position.begin(); i < stack[stack.size() - 1].position.end(); ++i){if (i == stack[stack.size() - 1].position.begin())cout << *i;elsecout << "," << *i;}cout << "个表元素" << endl;cout << "该表深度:" << depth << " 长度:" << stack[stack.size() - 1].numnode << endl;cout << "位置:" << endl;if (stack[stack.size() - 1].ptr->utype == 0){//当前非空子表为广义表本身cout << "该非空子表为广义表本身" << endl;}else{//当前非空子表为真子表,栈中存有完整位置信息,输出之output(stack);}cout << endl;}}depth--;ptr = stack[stack.size() - 1].ptr;stack.pop_back();TF = false;}else{++stack[stack.size() - 1].numnode;if (ptr->info.value == key)  //搜索到关键字{stack[stack.size() - 1].position.push_back(stack[stack.size() - 1].numnode);  //关键字在其所在子表的下一位置压入记录子表关键字位置的stack栈顶的position栈}ptr = ptr->tlink;flag = 1;}}}cout << "共有" << subcount << "个子表含有" << key << endl;return 0;
}void output(vector<Gennode> &stack)
{for (auto i = stack.begin(); i != stack.end() - 1; ++i){if (i == stack.begin()){cout << "广义表的第" << (*i).numnode << "个表元素";}else{cout << "的第" << (*i).numnode << "个表元素";}}cout << endl;
}void suboutput(Gen *head)
{Gen *ptr = head;bool TF = true;vector<Gen *> stack;while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1))  //注意{if (TF == true){stack.push_back(ptr);cout << "(";if (ptr->utype == 0)   //注意{ptr = ptr->tlink;}else{ptr = ptr->info.hlink;}}else{if (ptr == head)break;else{ptr = ptr->tlink;TF = true;}}}else{if (ptr == nullptr){cout << ")";ptr = stack[stack.size() - 1];if (ptr->utype != 0 && ptr->tlink != nullptr)    //注意cout << ",";stack.pop_back();TF = false;}else{cout << ptr->info.value;ptr = ptr->tlink;if (ptr != nullptr)cout << ",";}}}cout << endl;
}Gen * strtogen()
{string glist;cout << "请输入广义表的字符串形式" << endl;cin >> glist;Gen *ptr = nullptr; vector<Gen *> stack; bool TF;for (auto i = glist.cbegin(); i != glist.cend(); ++i){if (*i == '('){if (i == glist.cbegin()){ptr = new Gen(0);stack.push_back(ptr);TF = true;}else{Gen *temp = new Gen(1);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}stack.push_back(temp);TF = true;ptr = temp;}}else{if (*i == ')'){ptr = stack[stack.size() - 1];stack.pop_back();TF = false;}else{if (*i != ','){Gen *temp = new Gen(2, *i);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}ptr = temp;}}}}return ptr;
}

(3)在广义表中搜索指定深度子表:

每进入新的一层子表先检查下一层子表是否超过指定深度,若超过不进入下一层子表,直接跳过。每找到新子表,检验深度即可

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;struct Gen
{int utype;union{int ref;struct Gen *hlink;char value;}info;struct Gen *tlink;Gen(int u);Gen(int u, char v);
};
Gen::Gen(int u) :utype(u), tlink(nullptr)
{if (u == 0)info.ref = 0;elseinfo.hlink = nullptr;
}Gen::Gen(int u, char v) :utype(u), tlink(nullptr)
{info.value = v;
}class Gennode
{
public:int numnode;Gen *ptr;Gennode(Gen *p) :ptr(p), numnode(0) {}
};void output(vector<Gennode> &stack);
void suboutput(Gen *head);
Gen * strtogen();int main()
{int depth = 0; int maxdepth;int flag = 0; int subcount = 0; int emptycount = 0;bool TF = true;vector<Gennode> stack;Gen *ptr=strtogen();//ptr初始化为指向广义表附加头节点的指针cout << "请输入指定深度:" << endl;  //输入想要求出的相同深度子表的深度cin >> maxdepth;while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1)){if (TF == true){if (depth == maxdepth)  //下一层深度大于指定深度,不进入下一层,继续递进至本层下一节点{ptr = ptr->tlink;flag = 1;++stack[stack.size() - 1].numnode;continue;}depth++;if (ptr->utype == 0){Gennode temp(ptr);stack.push_back(temp);flag = 0;ptr = ptr->tlink;}else{++stack[stack.size() - 1].numnode;Gennode temp(ptr);stack.push_back(temp);flag = 2;ptr = ptr->info.hlink;}}else{if (ptr->utype == 0)break;else{ptr = ptr->tlink;flag = 1;TF = true;}}}else{if (ptr == nullptr){if (depth == maxdepth)  //找到指定深度子表{subcount++;if (flag == 2) //找到一个指定深度子空表{++emptycount;cout << "第" << subcount << "个指定深度的子表,为空表:()" << endl;cout << " 长度:" << 0 << endl;cout << "位置:" << endl;output(stack);}else{if (flag == 1){//找到一个指定深度非空子表cout << "第" << subcount << "个指定深度的子表(非空):";suboutput(stack[stack.size() - 1].ptr);//输出之该指定深度子表cout << " 长度:" << stack[stack.size() - 1].numnode << endl;cout << "位置:" << endl;if (stack[stack.size() - 1].ptr->utype == 0){//当前非空子表为广义表本身,cout << "该非空子表为广义表本身" << endl;}else{//当前非空子表为真子表,栈中存有完整位置信息,输出output(stack);}}else{++emptycount;//找到指定深度子空表,即为广义表本身,输出之cout << "第" << subcount << "个指定深度的子表,为空表:()" << endl;cout << " 长度:" << 0 << endl;cout << "位置:" << endl;cout << "该子空表为广义表本身" << endl;}}}depth--;ptr = stack[stack.size() - 1].ptr;stack.pop_back();TF = false;}else{++stack[stack.size() - 1].numnode;ptr = ptr->tlink;flag = 1;}}}cout << "共有" << subcount << "个指定深度的子表,其中有" << emptycount << "个空表" << endl;return 0;
}void output(vector<Gennode> &stack)
{for (auto i = stack.begin(); i != stack.end() - 1; ++i){if (i == stack.begin()){cout << "广义表的第" << (*i).numnode << "个表元素";}else{cout << "的第" << (*i).numnode << "个表元素";}}cout << endl;
}void suboutput(Gen *head)
{Gen *ptr = head;bool TF = true;vector<Gen *> stack;while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1))  //注意{if (TF == true){stack.push_back(ptr);cout << "(";if (ptr->utype == 0)   //注意{ptr = ptr->tlink;}else{ptr = ptr->info.hlink;}}else{if (ptr == head)break;else{ptr = ptr->tlink;TF = true;}}}else{if (ptr == nullptr){cout << ")";ptr = stack[stack.size() - 1];if (ptr->utype != 0 && ptr->tlink != nullptr)    //注意cout << ",";stack.pop_back();TF = false;}else{cout << ptr->info.value;ptr = ptr->tlink;if (ptr != nullptr)cout << ",";}}}cout << endl;
}Gen * strtogen()
{string glist;cout << "请输入广义表的字符串形式" << endl;cin >> glist;Gen *ptr = nullptr; vector<Gen *> stack; bool TF;for (auto i = glist.cbegin(); i != glist.cend(); ++i){if (*i == '('){if (i == glist.cbegin()){ptr = new Gen(0);stack.push_back(ptr);TF = true;}else{Gen *temp = new Gen(1);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}stack.push_back(temp);TF = true;ptr = temp;}}else{if (*i == ')'){ptr = stack[stack.size() - 1];stack.pop_back();TF = false;}else{if (*i != ','){Gen *temp = new Gen(2, *i);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}ptr = temp;}}}}return ptr;
}

(4)确定各个子表左右括号的起始终止位置以及序数

需要栈position记录入栈左括号序数位置,left,right分别记录左右括号序数,遇到左括号left增一,右括号right增一,扫描到附加头节点即左括号时左括号序数位置进栈,遍历完子表后栈顶元素存放子表左括号位置叙述,右括号位置序数由right,total给出,输出即可,然后出栈

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;struct Gen
{int utype;union{int ref;struct Gen *hlink;char value;}info;struct Gen *tlink;Gen(int u);Gen(int u, char v);
};
Gen::Gen(int u) :utype(u), tlink(nullptr)
{if (u == 0)info.ref = 0;elseinfo.hlink = nullptr;
}Gen::Gen(int u, char v) :utype(u), tlink(nullptr)
{info.value = v;
}class Gennode
{
public:int numnode;Gen *ptr;Gennode(Gen *p) :ptr(p), numnode(0) {}
};class position   //位置节点,记录入栈左括号的序数和在字符串中的位置
{
public:int place;  //位置int index;  //序数position(int p, int i) :place(p), index(i) {}
};void suboutput(Gen *head);
Gen * strtogen();int main()
{int flag = 0;bool TF = true;vector<Gennode> stack;vector<position> match;  //记录左括号位置序数的栈int left = 0, right = 0, total = 0; //初始化左括号序数,右括号序数,和当前在字符串广义表中遍历到的位置Gen *ptr = strtogen();//ptr初始化为指向广义表附加头节点的指针while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1)){if (TF == true){++left;   //扫描到附加头节点,对应左括号,因此left,total加一++total;position temp(total, left);  //入栈match.push_back(temp);if (ptr->utype == 0){Gennode temp(ptr);stack.push_back(temp);flag = 0;ptr = ptr->tlink;}else{++stack[stack.size() - 1].numnode;Gennode temp(ptr);stack.push_back(temp);flag = 2;ptr = ptr->info.hlink;}}else{if (ptr->utype == 0)break;else{ptr = ptr->tlink;flag = 1;TF = true;}}}else{if (ptr == nullptr){++right;     //子表遍历完毕,对应右括号,因此right,total加一++total;if (flag == 2) //找到一个子空表{cout << "子表 ():";}else{if (flag == 1){//找到一个非空子表cout << "子表 ";suboutput(stack[stack.size() - 1].ptr);//输出非空子表cout << ":";}else    //找到空表,为广义表本身{cout << "子表 ():";}}cout << endl;cout << " 长度:" << stack[stack.size() - 1].numnode << endl;cout << "(为从左至右数起第" << match[match.size() - 1].index << "个 ";  //输出当前子表左右括号序数位置cout << ")为第" << right << "个 ";cout << "(下标为" << match[match.size() - 1].place << " )下标为" << total << endl;cout << endl;match.pop_back();  //出栈ptr = stack[stack.size() - 1].ptr;if (ptr->utype != 0 && ptr->tlink != nullptr)++total;    //当前子表右括号后应跟逗号,故total加一stack.pop_back();TF = false;}else{++stack[stack.size() - 1].numnode;++total;     //对原子项total应加一ptr = ptr->tlink;if (ptr != nullptr)++total;    //原子项后跟逗号,total加一flag = 1;}}}return 0;
}void suboutput(Gen *head)
{Gen *ptr = head;bool TF = true;vector<Gen *> stack;while (true){if (ptr != nullptr && (ptr->utype == 0 || ptr->utype == 1))  //注意{if (TF == true){stack.push_back(ptr);cout << "(";if (ptr->utype == 0)   //注意{ptr = ptr->tlink;}else{ptr = ptr->info.hlink;}}else{if (ptr==head)break;else{ptr = ptr->tlink;TF = true;}}}else{if (ptr == nullptr){cout << ")";ptr = stack[stack.size() - 1];if (ptr->utype != 0 && ptr->tlink != nullptr)    //注意cout << ",";stack.pop_back();TF = false;}else{cout << ptr->info.value;ptr = ptr->tlink;if (ptr != nullptr)cout << ",";}}}
}Gen * strtogen()
{string glist;cout << "请输入广义表的字符串形式" << endl;cin >> glist;Gen *ptr = nullptr; vector<Gen *> stack; bool TF;for (auto i = glist.cbegin(); i != glist.cend(); ++i){if (*i == '('){if (i == glist.cbegin()){ptr = new Gen(0);stack.push_back(ptr);TF = true;}else{Gen *temp = new Gen(1);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}stack.push_back(temp);TF = true;ptr = temp;}}else{if (*i == ')'){ptr = stack[stack.size() - 1];stack.pop_back();TF = false;}else{if (*i != ','){Gen *temp = new Gen(2, *i);if (ptr->utype == 1){if (TF == true)ptr->info.hlink = temp;elseptr->tlink = temp;}else{ptr->tlink = temp;}ptr = temp;}}}}return ptr;
}

还有其他诸多未在上方给出实现的运算都很容易实现,有兴趣可以自己尝试

广义表的非递归深度优先遍历及相关运算的c++实现相关推荐

  1. 基于计数栈的非递归二叉树遍历算法

    转载请保留完整信息! 作者:中山大学 赵耀 10389332 创作时间:2013.11.25 发表时间:2013.12.11 背景 遍历算法一般可按深度优先或广度优先进行.对于二叉树,深度优先遍历可分 ...

  2. 二叉树遍历详解(递归遍历、非递归栈遍历,Morris遍历)

    一.前言 <二叉查找树全面详细介绍>中讲解了二叉树操作:搜索(查找).遍历.插入.删除.其中遍历深度优先遍历(DFS)按照实现方法可以分为:递归遍历实现.非递归遍历实现.Morris遍历实 ...

  3. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

  4. 九十五、二叉树的递归和非递归的遍历算法模板

    @Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...

  5. 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找

    数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法.但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法.鉴于层次遍历算法比较容易理解 ...

  6. 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树

    import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...

  7. 中序建立二叉树,非递归前序遍历二叉树

    内容: 编写程序,实现下述功能,并上机调试通过. 按中序顺序建立一棵二叉树: 用非递归方式遍历二叉树(先序),输出遍历序列. 步骤: 算法分析 采用二叉链表做存储结构,建立二叉树,借助于栈结构来实现二 ...

  8. java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

    package com.yc.test; import java.util.ArrayList; import java.util.List; import com.yc.tree.ThreeLink ...

  9. python非递归前序遍历二叉树_LintCode66:二叉树的前序遍历(python)

    66. 二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历. 样例 样例 1: 输入:{1,2,3} 输出:[1,2,3] 解释: 1 / \ 2 3 它将被序列化为{1,2,3} 前序遍历 样 ...

最新文章

  1. JMeter3.0 post参数/BeanShell中文乱码问题
  2. django中,kindeditor存到数据库的html,前台html标签被自动转义的解决办法
  3. antisamy java_antisamy的使用方法
  4. Linux维护笔记五
  5. weblogic概览下的上下文根配置_Weblogic服务下获取上下文路劲问题
  6. cplex安装_Excel软件规划求解工具的安装与功能介绍
  7. dz论坛服务器技术支持,服务器更换 升级 dz论坛首页 dz其他页面打开为空白解决方法...
  8. php7扩展sphinx,php7进行安装sphinx简单记录
  9. 大数据之-Hadoop之HDFS的API操作_写数据流程_上传数据原理剖析_案例---大数据之hadoop工作笔记0066
  10. 在CentOS 8上安装与配置Apache虚拟主机
  11. 取得数组最大值与最小值
  12. jQuery学习笔记:文档处理
  13. 黑龙江工程学院锐捷校园网连接路由器免认证
  14. 【电源科普】负载调整率
  15. linux temp文件夹在哪_linux基础知识笔记(第一天)
  16. 华为交换机配置(一)
  17. Oracle根据生日计算年龄
  18. Dsolve PDE基础
  19. 抽象类 与 委托 蛋蛋的忧桑
  20. 林园:为2009年培育“种子”

热门文章

  1. 测试之第九集手机兼容性你又了解多少呢
  2. 广播电视、有线电视科技术语缩写一览表
  3. Android Studio gradle配置阿里云仓库
  4. 无法安装vcredist_x86.exe, 提示无法访问Windows Installer服务
  5. 10Base-T 与 100Base-TX 的区别
  6. nohup,disown和的区别
  7. 10.29关于数字大爆炸游戏规则的重新理解以及重打
  8. 资产监测技术中关于GPS定位工具中的PDOP参数
  9. 真无线蓝牙耳机不仅颜值高,这几点好处简直太妙了!
  10. 什么是分布式_什么是分布式存储?分布式存储有什么优势?