描述
如果用大写字母标识二叉树节点,则一棵二叉树可以用以下字母序列建立,#表示空节点。试写一个递归算法,有这种形式的字符序列,建立相应的二叉树的二叉链表存储结构,并按层次遍历输出。如一棵二叉树可表示为:A(B(#,D),C(E(#,F),#))输入
按题中要求,用括号法输入二叉树序列,#表示空节点输出
按层次遍历建立好的二叉树并输出输入样例
A(B(#,D),C(E(#,F),#))输出样例
ABCDEF
#include<iostream>
#include<queue>
using namespace std;
typedef struct BTNode
{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode, *BTree;
queue<BTree> Q;
void Find_Comma(char *input,char * &find,int len)//在元素*input到*(input+len)找到以*input元素为根的子树节点数为len的能区分左、右子树的逗号
{
int num = 0;
char *p;
p = input+1;
for (int i = 0; i < len; i++)
{
if (num == 1 && *p == ',')
{
find = p;
break;
}
else
{
if (*p == '(') num++;
if (*p == ')') num--;
p++;
}
}
}
void Create_BiTree(BTree &T,char *input,int len)//*input为即将加入树中的元素,len为T的子树的长度
{
if (len > 0)//T的子树数目不为0
{
T = new BTNode;
T->data = *input;
}
if (len == 0)//T的子树数目为0,即此时的*input元素就是一个叶节点
{
if (*input == '#')
{
T = NULL;
}
else
{
T = new BTNode;
T->data = *input;
T->lchild = NULL;
T->rchild = NULL;
}
return;
}
char *find;
Find_Comma(input,find,len);
int len1, len2;
len1 = find - input - 2;//T的左子树长度
len2 = len - (find-input)-1;//T的右子树长度
Create_BiTree(T->lchild, input+2, len1-1);//建立T的左子树,减去T的左子树的根T->lchild
Create_BiTree(T->rchild, find+1, len2-1);//建立T的右子树,减去T的右子树的根T->rchild
}
void LevelOrderTraverse(BTree T)
{
cout << T->data << " ";
if (T->lchild) Q.push(T->lchild);
if (T->rchild) Q.push(T->rchild);
Q.pop();
if (!Q.empty()) LevelOrderTraverse(Q.front());
}
int main()
{
BTree T;
int len;
char input[100];
cin >> input;
len = strlen(input + 1);//T的子树长度
Create_BiTree(T,input,len);
Q.push(T);
LevelOrderTraverse(Q.front());
cout << endl;
return 0;
}
程序运行结果示意图