(二)前缀,中缀,后缀表达式
- 如何根据前缀表达式递归建立二叉树
比如: * + 1 3 – 6 4
a.读入下一个算术运算符或者数值,
b.创建一个包含运算符或者数值的节点,
c.如何是运算符 则递归创建跟运算符的操作数对应的子数 否则节点是叶子节点
struct Node{
ElemType data;
Node *left;
Node *right;
};
//创建二叉树的节点
方法一:
Node *buildTree()
{
char ch = getchar(); //每次读取一个字符
Node *node;
if(ch >= '0' && ch <= '9'){ //如果是操作数,则是叶子节点
node = new Node;
node->data = ch;
node->left = NULL;
node->right = NULL;
}
else{ //否则是内部节点
node = new Node;
node->data = ch;
node->left = buildTree();
node->right = buildTree();
}
return node;
}
int main()
{
Node *root; //创立根节点
root = buildTree();
Traverse(root); //遍历二叉树
DelExpTree(root); //释放二叉树节点内存
return 0;
}
方法二:
int cur = -1;
void buildTree(Node *node, char *data)
{
char ch = data[++cur];
printf("%c\n", ch);
if(ch >= '0' && ch <= '9'){
node->data = ch;
node->left = NULL;
node->right = NULL;
}
else{
node->data = ch;
node->left=new Node();
buildTree(node->left, data);
node->right=new Node();
buildTree(node->right, data);
}
}
int main()
{
Node *root;
root=new Node; //创立根节点
char data[1000];
scanf("%s", data); //将表达式以字符形式读入进来
buildTree(root, data); //建立二叉树
Traverse(root); //遍历二叉树
DelExpTree(root); //释放二叉树节点的内存
return 0;
}
注意上述两种方法的区别,体会之间的差异。

浙公网安备 33010602011771号