广义表与二叉树之间的相互转换
二叉树是树形结构中一种特殊的树,其特点是每个结点最多只有两个孩子结点。二叉树除了可以通过典型的树状图来表示外,还可以使用广义表进行表示,例如:A(B,C)表示根结点A的左孩子结点为B,右孩子结点为C;A(,C)表示根结点A的左子树为空,右孩子结点为C。依此类推,可以将任何一棵二叉树以广义表的形式表示出来。
广义表转化为二叉树
广义表转化成二叉树可以借助栈来实现,利用栈先进后出的特点,先将根结点压入栈中,如果左孩子结点不为空,则将其作为栈顶结点的左孩子结点,并压入栈中,递归左子树,处理完之后左孩子结点出栈;如果右孩子不为空,则将其作为栈顶结点的右孩子结点,并压入栈中,递归右子树,处理完之后右孩子结点出栈。
/*
设置一个标记变量flag,初始值为-1,并设置一个标记结点
循环遍历广义表的字符串str
如果str[i]是左括号:
把flag置为0;
把p压入栈中
否则如果str[i]是逗号:
把flag置为1;
否则如果str[i]是右括号:
则栈顶元素出栈;
否则如果str[i]是一个字母,则用结点temp来存储;
如果flag为-1:
则把temp作为根结点并压入栈中
如果flag为0:
如果此时栈顶结点为p,则先出栈,然后将temp作为栈顶结点的左孩子,并将temp压入栈中
如果flag为1:
栈顶元素出栈,将temp作为栈顶结点的右孩子,并将temp压入栈中
*/
Node *build(const string &str) {
int len = str.size();
if(len == 0) return NULL;
stack<Node *> stk;
Node *temp = NULL, *p = new Node('#');
int flag = -1;
for(int