(二)前缀,中缀,后缀表达式

  1. 如何根据前缀表达式递归建立二叉树

比如: * + 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;

}

 

 

注意上述两种方法的区别,体会之间的差异。

posted @ 2013-11-28 18:54  i梦  阅读(150)  评论(0)    收藏  举报