给定二叉树的中序和后序排列,我们可以通过分析中序遍历和后序遍历的特点来确定二叉树的前序排列。

中序遍历的特点是左子树 -> 根节点 -> 右子树,后序遍历的特点是左子树 -> 右子树 -> 根节点。

我们知道后序遍历的最后一个节点一定是根节点,所以我们可以根据后序遍历的最后一个节点确定根节点。

然后我们在中序遍历中找到根节点的位置,根节点左边的节点都是左子树的节点,右边的节点都是右子树的节点。

根据中序遍历中左子树的节点数量,我们可以在后序遍历中找到左子树的节点和右子树的节点。

然后我们可以递归地构建左子树和右子树,并将根节点和左子树和右子树的前序排列拼接起来,即可得到整个二叉树的前序排列。

下面是一个示例代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize) {
    if (inorderSize == 0 || postorderSize == 0) {
        return NULL;
    }

    // 后序遍历的最后一个节点是根节点
    int rootVal = postorder[postorderSize - 1];
    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    root->val = rootVal;
    root->left = NULL;
    root->right = NULL;

    // 在中序遍历中找到根节点的位置
    int rootIndex;
    for (int i = 0; i < inorderSize; i++) {
        if (inorder[i] == rootVal) {
            rootIndex = i;
            break;
        }
    }

    // 根据中序遍历中根节点左边的节点数量,确定后序遍历中左子树和右子树的节点数量
    int leftSize = rootIndex;
    int rightSize = inorderSize - rootIndex - 1;

    // 递归构建左子树和右子树
    root->left = buildTree(inorder, leftSize, postorder, leftSize);
    root->right = buildTree(inorder + rootIndex + 1, rightSize, postorder + leftSize, rightSize);

    return root;
}

void preorderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }

    printf("%d ", root->val);
    preorderTraversal(root->left);
    preorderTraversal(root->right);
}

int main() {
    int inorder[] = {4, 2, 5, 1, 6, 3};
    int postorder[] = {4, 5, 2, 6, 3, 1};
    int size = sizeof(inorder) / sizeof(inorder[0]);

    TreeNode* root = buildTree(inorder, size, postorder, size);

    printf("前序排列:");
    preorderTraversal(root);

    return 0;
}

输出结果为:1 2 4 5 3

c语言给定二叉树的中序和后序排列确定二叉树的前序排列数组遍历

原文地址: http://www.cveoy.top/t/topic/hQyQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录