数据结构 - 反向构造二叉树

分析:由于前序遍历中首先遍历的是根节点,所以可以确定A是根节点,中序遍历中是先遍历是按照左根右的顺序,所以A的左边HBEDF是左子树,GC是右子树。

接着前序遍历中B是先遍历的所以B是根节点,在中序遍历中B的左边H就是B的左结点,EDF是右子树。

然后在前序遍历中F是先遍历的所以F是根节点,在中序遍历中F的左边是ED,所以ED是F的左子树。

然后在前序遍历中D是先遍历的,所以D是根节点,在中序遍历中E在D的左边,所以E是D的左子树,这样根节点的左子树就遍历完了。

最后在前序遍历中C在G的前面,所以C是根节点,G是C的子结点,在中序遍历中G在C的左边,所以G是C的左结点。

 

最后推倒出的结果如下:

 

以下是一个基于递归的C程序,可以根据中序和前序遍历序列反向构造一棵二叉树: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* left; struct Node* right; } Node; int search(int arr[], int start, int end, int value) { int i; for (i = start; i <= end; i++) { if (arr[i] == value) { return i; } } } Node* newNode(int data) { Node* node = (Node*)malloc(sizeof(Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } Node* buildTree(int in[], int pre[], int inStart, int inEnd, int* preIndex) { if (inStart > inEnd) { return NULL; } Node* node = newNode(pre[*preIndex]); (*preIndex)++; if (inStart == inEnd) { return node; } int inIndex = search(in, inStart, inEnd, node->data); node->left = buildTree(in, pre, inStart, inIndex - 1, preIndex); node->right = buildTree(in, pre, inIndex + 1, inEnd, preIndex); return node; } void printInorder(Node* node) { if (node == NULL) { return; } printInorder(node->right); printf("%d ", node->data); printInorder(node->left); } int main() { int in[] = { 4, 2, 5, 1, 6, 3 }; int pre[] = { 1, 2, 4, 5, 3, 6 }; int len = sizeof(in) / sizeof(in[0]); int preIndex = 0; Node* root = buildTree(in, pre, 0, len - 1, &preIndex); printf("反向构造二叉树中序遍历序列为:\n"); printInorder(root); return 0; } ``` 输入中序遍历序列和前序遍历序列,程序将会构造出一棵二叉树,并打印出它的中序遍历序列(反向构造的结果)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值