c语言给定二叉树的中序和后序排列确定二叉树的前序排列
在中序遍历序列中,根节点的位置将左子树和右子树分开。而在后序遍历序列中,根节点位于序列的最后一个位置。
我们可以根据这个特点来确定二叉树的前序遍历序列。
首先,我们可以根据后序遍历序列找到根节点。后序遍历序列的最后一个元素就是根节点的值。
然后,在中序遍历序列中,找到根节点的位置。根节点的位置将中序遍历序列分成左子树和右子树。
接下来,我们可以递归地确定左子树和右子树的前序遍历序列。
左子树的中序遍历序列是根节点左边的部分,后序遍历序列是根节点前面的一部分。所以,左子树的前序遍历序列可以通过递归调用来确定。
右子树的中序遍历序列是根节点右边的部分,后序遍历序列是根节点后面的一部分。所以,右子树的前序遍历序列可以通过递归调用来确定。
最后,将根节点的值放在前序遍历序列的最前面,然后依次将左子树的前序遍历序列和右子树的前序遍历序列放在根节点值的后面,就得到了整个二叉树的前序遍历序列。
下面是用C语言实现的代码:
#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;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = postorder[postorderSize - 1];
int rootIndex = 0;
while (inorder[rootIndex] != root->val) {
rootIndex++;
}
root->left = buildTree(inorder, rootIndex, postorder, rootIndex);
root->right = buildTree(inorder + rootIndex + 1, inorderSize - rootIndex - 1, postorder + rootIndex, postorderSize - rootIndex - 1);
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, 3};
int postorder[] = {4, 5, 2, 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,即二叉树的前序遍历序列
原文地址: http://www.cveoy.top/t/topic/hQym 著作权归作者所有。请勿转载和采集!