输入广义表形式的树(字符串),删除指定值的节点(节点值为单个字母)及其子树,并且输出此时树的广义表形式
2017-08-08 22:31
435 查看
#include<iostream> #include<string> #include<stack> using namespace std; class Node{ public: char data; Node *lchild, *rchild; Node(char _data){ data = _data; lchild = NULL; rchild = NULL; } ~Node(){ if (lchild != NULL){ delete lchild; lchild = NULL; } if (rchild != NULL){ delete rchild; rchild = NULL; } } void build(const string& str){//由广义表建树,其实就是先序遍历 int k = -1; stack<Node*> Stack; Stack.push(this); for (int i = 1; i < str.length(); i++){ if (str[i] == '('){ k = 0;//表示进入下一层 Node* p = new Node(str[i]);//标记节点,区分左右 Stack.push(p); } else if (str[i] == ','){ k = 1;//表示转向右子树 } else if (str[i] == ')'){ Stack.pop();//表示返回上一层 } else { Node *temp = new Node(str[i]); if (k == -1){ Stack.push(temp);//作为根节点直接入栈 } else if (k == 0){//这种形式a,(b,c) if (Stack.top()->data == '('){ Stack.pop();//也就把上次的左括号出栈 } Stack.top()->lchild = temp;//作为栈顶的左孩子 Stack.push(temp); } else if (k == 1){ //这种形式a(,c) Stack.pop(); Stack.top()->rchild = temp; Stack.push(temp); } } } } void output(){//输出广义表形式 cout << data; if (lchild != NULL){ cout << '('; lchild->output(); } if (rchild != NULL){ if (lchild == NULL){ cout << "("; } cout << ','; rchild->output(); cout << ')'; } if(lchild!=NULL&&rchild==NULL){//防止右子树为空时缺少右括号 cout << ')'; } } }; class BinaryTree{ private: Node *root; public: BinaryTree(){ root = NULL; } BinaryTree(Node*& del){ root = del; } BinaryTree(const string& str){//由广义表建树 root = new Node(str[0]); root->build(str); } ~BinaryTree(){ if (root != NULL){ delete root; root = NULL; } } void output(){ root->output(); } void find_remove(char delete_data){//查找值为delete_data的节点,并删除它及其子树。 前提:该值不能为 整棵树的根节点 stack<Node*> s; s.push(root); Node* p = this->root; while (!s.empty()){ /* 栈的特点:先进后出 先被访问的根节点的右子树后被访问 */ if (p->lchild != NULL){ //找到父节点 if (p->lchild->data == delete_data){ BinaryTree deleteSubTree(p->lchild);//构建待删除的子树,利用析构函数删除 deleteSubTree.~BinaryTree(); p->lchild = NULL; //切断子树 return; } } if (p->rchild != NULL){ if (p->rchild->data == delete_data){ BinaryTree delete_tree(p->rchild);//构建待删除的子树,利用析构函数删除 delete_tree.~BinaryTree(); p->rchild = NULL;//切断子树 return; } } if (p->rchild){ s.push(p->rchild); } if (p->lchild){ p = p->lchild; } else{ //左子树访问完了,访问右子树 p = s.top(); s.pop(); } } } }; int main(){ string str; char search; cin >> str>>search;//7(4(3,6),1(,5)) BinaryTree binarytree(str); if (str.find(search) == str.npos){//如果没找到这个数值 binarytree.output();//直接输出 } else{ if (search != str[0]){//不删除头结点时 binarytree.find_remove(search);//删除该值的节点及其子树 binarytree.output(); } } system("pause"); return 0; }
相关文章推荐
- C语言 字符串 编一个程序,输入一个字符串,将组成字符串的所有非英文字母的字符删除后输出。
- php字符串可以用数组的形式输出单个字母
- 规定输入的字符串中,只能包含字母和*号,编写函数fun(char *a),其功能是:将字符串前、后的连续*号全部删除。主函数中输入字符串,调用函数,并输出结果字符串。例如:若字符串中的内容为: ***
- 【SQL精彩语句】SQL SERVER 2000中查询指定节点及其所有子节点的函数(表格形式显示)
- 输入一个字符串,如果第一个字符是大写并且其他字符不是大写,那么输出true,否则输出false。
- [Java练习]输入一个字符串,输出其中某个小写字母出现的次数
- 用链表形式存储一个字符串,插入、删除某个字符,最后按正序、逆序两种方式输出字符串
- java输入字符串输出首字母大写以及全拼
- BOM查找指定子项的所有父项,并以字符串的形式输出
- 【SQL精彩语句】SQL SERVER 2005中查询指定节点及其所有子节点的方法(表格形式显示)
- C语言青葱之路-----输入字符串,输出其中数字、字母、空格、其他的个数
- 在字符串中删除对应位数的字符,然后 输出删除指定字符后的字符串
- c++输入字符串和子字符串 输出子字符串在字符串中出现的次数 并输出字符串中的字母
- 输入一个字符串,输出这个字符串中重复的元素及其个数
- 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
- 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则: 1、仅压缩连续重复出现的字符。比如字符串"abcbc
- 编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格,和其他字符的个数,在主函数中输入字符串以及输出上述统计的结果。再考虑将算的的结果放在一个数组中
- 输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及其首字符的位置
- 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
- 编写一个程序,从标准输入读取字符,并把它们写到标准输出中。除了大写字母字符要转化为小写字母之外,所有字符的输出形式应该和他的输入形式完全相同