给出一棵二叉树的中序与后序排列。求出它的先序排列。约定树结点用不同的大写字母表示长度≤8c语言
可以使用递归的方式来实现先序遍历二叉树。先序遍历的顺序是:根节点 - 左子树 - 右子树。
具体步骤如下:
- 找到后序遍历中的最后一个节点,即为根节点。
- 在中序遍历中找到根节点的位置,根节点左边的节点为左子树的中序遍历,根节点右边的节点为右子树的中序遍历。
- 根据中序遍历中左子树的长度,可以在后序遍历中确定左子树的后序遍历,根据左子树的长度和根节点的位置,可以在后序遍历中确定右子树的后序遍历。
- 递归地对左子树和右子树进行先序遍历,直到叶子节点。
下面是具体的代码实现:
#include <stdio.h>
void preorder(char *inorder, char *postorder, int inStart, int inEnd, int postStart, int postEnd) {
if (inStart > inEnd || postStart > postEnd) {
return;
}
// 根节点为后序遍历的最后一个节点
char root = postorder[postEnd];
printf("%c ", root);
// 在中序遍历中找到根节点的位置
int rootIndex;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == root) {
rootIndex = i;
break;
}
}
// 左子树的长度
int leftLength = rootIndex - inStart;
// 递归遍历左子树
preorder(inorder, postorder, inStart, rootIndex - 1, postStart, postStart + leftLength - 1);
// 递归遍历右子树
preorder(inorder, postorder, rootIndex + 1, inEnd, postStart + leftLength, postEnd - 1);
}
int main() {
char inorder[] = "DBFEA";
char postorder[] = "DFEB";
int length = sizeof(inorder) / sizeof(inorder[0]);
printf("先序遍历结果:");
preorder(inorder, postorder, 0, length - 1, 0, length - 1);
return 0;
}
输出结果为:D B A F
原文地址: https://www.cveoy.top/t/topic/hPYw 著作权归作者所有。请勿转载和采集!