赞
踩
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #define MAXSIZE 100//最大节点数
- using namespace std;
-
-
- typedef struct BiTnode{
- char data;
- struct BiTnode * lchild, * rchild;
- }BiTnode, * BiTree;
-
- //二叉树的建立
- BiTnode* CreateBTree(char* str) {
- BiTnode* St[100], * p=NULL, * b;//st作为顺序栈,保存双亲结点
- int top = -1, k, j = 0;//top为栈顶指针
- char ch;
- b = NULL;//初始时二叉链表为空
- ch = str[j];
- while (ch != '\0')//循环处理,直到str中的每个字符扫描完毕
- {
- switch (ch)
- {
- case '(':top++; St[top] = p; k = 1; break;//开始处理左孩子结点
- case ')':top--; break;//双亲结点的子树处理完毕
- case',':k = 2; break;//处理右孩子结点
- default://遇到数据时创建新结点
- p = (BiTnode*)malloc(sizeof(BiTnode));
- p->data = ch;
- p->lchild = p->rchild = NULL;
- if (b == NULL)//尚未设置根节点
- {
- b = p;
- }
- else
- {
- switch (k)//新建结点和栈顶双亲结点的关系
- {
- case 1:St[top]->lchild = p; break;
- case 2:St[top]->rchild = p; break;
- }
- }
- }
- j++;
- ch = str[j];
- }
-
- return b;
- }
-
- void visit(BiTree t) {
-
- cout << t->data << ' ';
-
- }
-
- int PreOrderTraverse(BiTree t) {
- if (t==NULL)
- {
- return 0;
- }
- else
- {
- visit(t);
- PreOrderTraverse(t->lchild);
- PreOrderTraverse(t->rchild);
- return 1;
- }
-
-
- }
-
- int InOrderTraverse(BiTree t) {
- if (t == NULL)
- {
- return 0;
- }
- else
- {
- InOrderTraverse(t->lchild);
- visit(t);
- InOrderTraverse(t->rchild);
- return 1;
- }
-
-
- }
-
-
- int PostOrderTraverse(BiTree t) {
- if (t == NULL)
- {
- return 0;
- }
- else
- {
- PostOrderTraverse(t->lchild);
-
- PostOrderTraverse(t->rchild);
- visit(t);
- return 1;
- }
-
-
- }
-
-
- int main() {
- char str[100] = { '\0' };
- while (cin >> str) {
-
- BiTree t = CreateBTree(str);
- PostOrderTraverse(t);
- cout << endl;
- }
- return 0;
- }
括号字符串表示法是一种用括号来表示二叉树结构的方法。在这种表示法中,每个节点都由一对括号包围,并且子树之间以逗号分隔。具体地说,左括号表示子树的开始,右括号表示子树的结束,逗号表示左右子树之间的分隔。
例如,下面的括号字符串 (A,(B,(D),(E)),(C,(F),()))
表示的二叉树如下图所示:
我们可以根据括号字符串建立二叉树的过程如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。