文本二叉树

来源:互联网 发布:虚拟设计软件 编辑:程序博客网 时间:2024/06/03 21:02
/*3:文本二叉树查看 提交 统计 提问总时间限制: 1000ms 内存限制: 65536kB描述如上图,一棵每个节点都是一个字母,且字母互不相同的二叉树,可以用以下若干行文本表示:A-B--*--C-D--E---*---F在这若干行文本中:1) 每个字母代表一个节点。该字母在文本中是第几行,就称该节点的行号是几。根在第1行2) 每个字母左边的'-'字符的个数代表该结点在树中的层次(树根位于第0层)3) 若某第 i 层的非根节点在文本中位于第n行,则其父节点必然是第 i-1 层的节点中,行号小于n,且行号与n的差最小的那个4) 若某文本中位于第n行的节点(层次是i) 有两个子节点,则第n+1行就是其左子节点,右子节点是n+1行以下第一个层次为i+1的节点5) 若某第 i 层的节点在文本中位于第n行,且其没有左子节点而有右子节点, 那么它的下一行就是 i+1个'-' 字符再加上一个 '*' 给出一棵树的文本表示法,要求输出该数的前序、后序、中序遍历结果输入第一行是树的数目 n接下来是n棵树,每棵树以'0'结尾。'0'不是树的一部分每棵树不超过100个节点输出对每棵树,分三行先后输出其前序、后序、中序遍历结果两棵树之间以空行分隔样例输入2A-B--*--C-D--E---*---F0A-B-C0样例输出ABCDEFCBFEDABCAEFDABCBCABAC*/include<iostream>#include<algorithm>#include<string>#include<stack>using namespace std;struct Node{char c;Node *leftChild, *rightChild;int len;int d;   //记录左右节点,0为左节点,1为右节点};Node* BuildTree(){string s;int len,top = 1;stack<Node*> Stack;cin >> s;Node *root = new Node;root->c = s[0];root->leftChild = NULL;root->rightChild = NULL;root->len = 0;root->d = 0;Stack.push(root);while (cin >> s){if (s == "0")break;len = s.length();Node *new_Node = new Node;new_Node->c = s[len - 1];new_Node->leftChild = NULL;new_Node->rightChild = NULL;new_Node->len = len-1;new_Node->d = 0;Node *r = Stack.top();while (new_Node->len - r->len != 1){Stack.pop();r = Stack.top();}if (new_Node->c == '*'){r->d++;continue;}if (r->d == 0){r->leftChild = new_Node;r->d++;}else if (r->d == 1){r->rightChild = new_Node;r->d++;}if (r->d == 2)Stack.pop();Stack.push(new_Node);}return root;}void PreOrder(Node *root){if (root){cout << root->c;PreOrder(root->leftChild);PreOrder(root->rightChild);}}void InOrder(Node *root){if (root){InOrder(root->leftChild);cout << root->c;InOrder(root->rightChild);}}void PostOrder(Node *root){if (root){PostOrder(root->leftChild);PostOrder(root->rightChild);cout << root->c;}}int main(){int t;cin >> t;for (int i = 0; i < t; ++i){Node *root = BuildTree();PreOrder(root);cout << endl;PostOrder(root);cout << endl;InOrder(root);cout << endl;cout << endl;}return 0;}

0 0
原创粉丝点击