二叉树的广义表表示如下图所示:
根据广义表创建一颗二叉树:
- 若元素为字母,则创建一个新结点nest;
- 若该结点不是二叉树的根结点,则将该结点作为左孩子(flag=’l’)或者右孩子(flag=’r’)链接到父结点上(即栈顶结点);
- 若元素为左括号,将flag置’l’,同时将结点nest压栈;
- 若元素为右括号,表明一个子表结束,做退栈操作;
- 若元素为逗号,表明以左孩子为根的子树处理完毕,将flag置’r’;
如此处理直至完毕.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using namespace std;
/**
* 广义表建立二叉树
*/
typedef char DATA_TYPE;
typedef struct node
{
DATA_TYPE value;
node *lchild, *rchild;
} Node;
stack<Node*> nodeStack;
//释放内存
void destroyTree(Node *h)
{
if(h)
{
// printf("node = %c\n", h->value);
destroyTree(h->lchild);
printf("node = %c\n", h->value);
destroyTree(h->rchild);
free(h);
}
}
//根据广义表表示来建立二叉树
Node *buildTree(char nodeStr[])
{
Node *head = NULL, *nest = NULL;
char flag = 'l';
int i = 0;
while(nodeStr[i] != '@')
{
switch(nodeStr[i])
{
case '(':
flag = 'l';
nodeStack.push(nest);
break;
case ')':
nodeStack.pop();
break;
case ',':
flag = 'r';
break;
default :
nest = (Node*)malloc(sizeof(Node));
nest->value= nodeStr[i];
nest->lchild = nest->rchild=NULL;
if(!nodeStack.empty() && flag == 'l')
{
nodeStack.top()->lchild = nest;
}
else if(!nodeStack.empty() && flag=='r')
{
nodeStack.top()->rchild=nest;
}
if(!head) head = nest;
}
i++;
}
return head;
}
int main()
{
char nodeStr[] = "a(b(d),c(f(,e),g))@";
Node *h = buildTree(nodeStr);
destroyTree(h);
return 0;
}
好久没写c语言了,感觉自己将它们全都忘光了.今天翻出来ppt看到广义表,就想动手写出来,没想到写完发现跟ppt上给的算法一模一样——–看来我不是忘记它们,而是我对自己没有信心,以为自己把它们全都忘记了.
写上一句话激励自己吧:
世上无难事,只要肯登攀!