二叉树的基本操作

【问题描述】已知二叉树的先序遍历序列和中序遍历序列(二叉树中元素类型为字符类型,元素个数不超过20),输出该二叉树的后序遍历序列,并输出该二叉树的高度和叶子节点数。

【输入形式】二叉树的先序序列 二叉树的中序序列

【输出形式】二叉树的后序序列 二叉树的高度 二叉树叶子节点数

【样例输入】ABDEGICFH DBGIEAFHC

【样例输出】

DIGEBHFCA

5 3

【样例说明】

【评分标准】

#include 
#include 
#include 
using namespace std;
struct Node {
    char val;
    Node* left;
    Node* right;
};
// 根据先序和中序构建二叉树
Node* buildTree(string preorder, string inorder) {
    if (preorder.empty()) {
        return 0;
    }
    
    Node* root = new Node();
    root->val = preorder[0];
    
    int rootIndex = inorder.find(preorder[0]);
    string leftInorder = inorder.substr(0, rootIndex);
    string rightInorder = inorder.substr(rootIndex + 1);
    
    string leftPreorder = preorder.substr(1, leftInorder.length());
    string rightPreorder = preorder.substr(leftInorder.length() + 1);
    
    root->left = buildTree(leftPreorder, leftInorder);
    root->right = buildTree(rightPreorder, rightInorder);
    return root;
}
// 后序遍历二叉树
void postorderTraversal( Node * root, string& result) {
    if (root == NULL ) {
        return;
    }
    
    postorderTraversal(root->left, result);
    postorderTraversal(root->right, result);
    result += root->val;
}
// 计算二叉树的高度
int getHeight(Node* root) {
    if (root == NULL ) {
        return 0;
    }
    
    return max(getHeight(root->left), getHeight(root->right)) + 1;
}
// 计算二叉树的叶子节点数
int getLeafNodeCount(Node* root) {
    if (root == NULL ) {
        return 0;
    }
    
    if (root->left == NULL&& root->right == NULL) {
        return 1;
    }
    
    return getLeafNodeCount(root->left) + getLeafNodeCount(root->right);
}
int main() {
    string preorder, inorder;
    cin >> preorder;
    cin >> inorder;
    
    Node* root = buildTree(preorder, inorder);
    
    string postorder;
    postorderTraversal(root, postorder);
    
    int height = getHeight(root);
    int leafNodeCount = getLeafNodeCount(root);
    
    cout << postorder << endl;
    cout << height ;
    cout << " " << leafNodeCount << endl;
    return 0;
}

  1. 定义了二叉树结构体Node,包含数据域val、左子节点指针left和右子节点指针right

  2. 实现了buildTree函数,该函数根据先序序列和中序序列构建二叉树。函数的参数为先序序列和中序序列。

    a. 首先判断先序序列是否为空,若为空,则返回空指针。

    b. 创建根节点,并将根节点的值设置为先序序列的第一个元素。

    c. 在中序序列中查找根节点的索引位置,使用find函数查找。

    d. 根据根节点在中序序列中的位置,分割中序序列为左子树的中序序列和右子树的中序序列。

    e. 分割先序序列为左子树的先序序列和右子树的先序序列。

    f. 递归调用buildTree函数构建左子树和右子树,传入对应的先序序列和中序序列。

    g. 将左子树和右子树连接到根节点的左右指针。

    h. 返回根节点。

  3. 实现了postorderTraversal函数,该函数用于计算二叉树的后序遍历序列。函数的参数包括当前节点和后序遍历序列的引用。

    a. 如果当前节点为空,直接返回。

    b. 递归调用postorderTraversal函数遍历左子树。

    c. 递归调用postorderTraversal函数遍历右子树。

    d. 将当前节点的值添加到后序遍历序列中。

  4. 实现了getHeight函数,该函数用于计算二叉树的高度。函数的参数为当前节点。

    a. 如果当前节点为空,返回0。

    b. 递归调用getHeight函数计算左子树的高度。

    c. 递归调用getHeight函数计算右子树的高度。

    d. 返回左子树高度和右子树高度的较大值加1。

  5. 实现了getLeafNodeCount函数,该函数用于计算二叉树的叶子节点数。函数的参数为当前节点。

    a. 如果当前节点为空,返回0。

    b. 如果当前节点的左子节点和右子节点都为空,表示当前节点是叶子节点,返回1。

    c. 递归调用getLeafNodeCount函数计算左子树的叶子节点数。

    d. 递归调用getLeafNodeCount函数计算右子树的叶子节点数。

    e. 返回左子树叶子节点数和右子树叶子节点数的和。

  6. main函数中,获取用户输入的先序序列和中序序列。

  7. 调用buildTree函数构建二叉树,传入先序序列和中序序列。

  8. 创建一个空字符串postorder,用于存储后序遍历序列。

  9. 调用postorderTraversal函数计算二叉树的后序遍历序列,将结果存储在postorder中。

  10. 调用getHeight函数计算二叉树的高度,将结果存储在height变量中。

  11. 调用getLeafNodeCount函数计算二叉树的叶子节点数,将结果存储在leafNodeCount变量中。

  12. 输出后序遍历序列、高度和叶子节点数。

你可能感兴趣的:(算法,图论,数据结构)