C++ 广义表转二叉树,二叉树转广义表

#include 
#include 

struct BinTreeNode {
    char data;
    BinTreeNode *leftChild;
    BinTreeNode *rightChild;
};

// 前序遍历二叉树
void PreOrder(BinTreeNode *p) {
    if(p != NULL) {
        std::cout << p->data << " ";
        PreOrder(p->leftChild);
        PreOrder(p->rightChild);
    }
}

//  广义表 -> 二叉树
BinTreeNode *TableToBinary() {
    std::stack s;
    char ch;
    int k; // 判读是左孩子还是右孩子
    BinTreeNode *current, *newNode, *root;
    
    root = NULL;
    k = 1;
    std::cout << "请输入广义表(以'#'结束):";
    std::cin >> ch; // 输入第一个字符
    while(ch != '#') {
        switch(ch) {
            case '(': // 左孩子准备来了
                s.push(newNode);
                k = 1;
                break;
            case ',': // 右孩子准备来了
                k = 2;
                break;
            case ')': // 这个结点的孩子处理完了
                s.pop();
                break;
            default:
                newNode = new BinTreeNode();
                if(newNode == NULL) {
                    std::cerr << "申请空间失败!\n";
                    exit(1);
                }
                newNode->data = ch; // 是结点值,生成
                newNode->leftChild = newNode->rightChild = NULL;
                if(root == NULL) { // 是第一个结点:即根结点
                    root = newNode;
                } else { // 不是第一个结点
                    if(k == 1) { // 左孩子
                        current = s.top();
                        current->leftChild = newNode;
                    } else { // 右孩子
                        current = s.top();
                        current->rightChild = newNode;
                    }
                }
        } // switch
        std::cin >> ch;
    } // while
    return root;
} // TableToBinary

// 创建二叉树
BinTreeNode *CreateBinaryTree() {
    BinTreeNode *p;
    char ch;
    
    std::cin >> ch;
    if(ch == '#')
        return NULL;
    p = new BinTreeNode();
    p->data = ch;
    p->leftChild = CreateBinaryTree();
    p->rightChild = CreateBinaryTree();
    return p;
}

// 二叉树->广义表
// 不考虑左子树为空,而右子树存在的情况,要不出现:2(,3)很奇怪
void BinaryToTable(BinTreeNode *current) {
    if(current != NULL) {
        std::cout << current->data;
        if(current->leftChild != NULL || current->rightChild != NULL)
        { // 有孩子
            std::cout << "(";
            BinaryToTable(current->leftChild); // 输出左子树
            if(current->rightChild != NULL) { // 存在右子树
                std::cout << ",";
                BinaryToTable(current->rightChild);
            }
            std::cout << ")"; // 输出括号)
        }
    }
}

int main(int argc, const char * argv[]) {
    int finsished, choose;
    BinTreeNode *root;
    
    finsished = 0;
    while(!finsished) {
        std::cout << "\n***********菜单**************\n";
        std::cout << "1:广义表->二叉树\n";
        std::cout << "2:二叉树->广义表\n";
        std::cout << "3:退出\n";
        std::cout << "请输入选择[1-3]:";
        std::cin >> choose;
        switch(choose) {
            case 1:
                root = TableToBinary();
                std::cout << "生成的二叉树为:\n";
                PreOrder(root);
                break;
            case 2:
                std::cout << "请输入数据,创建二叉树:";
                root = CreateBinaryTree();
                BinaryToTable(root); // 输出广义表
                break;
            case 3:
                finsished = 1;
                break;
            default:
                std::cout << "输入错误,请重新输入!\n";
        }
    }
    return 0;
}

测试:

C++ 广义表转二叉树,二叉树转广义表_第1张图片

你可能感兴趣的:(数据结构)