中序遍历为BDCEAFHG后序遍历为DECBHGFA已知二叉树的中序遍历和后序遍历使用C语言编写完整程序输出该二叉树的前序遍历结果要求不能使用递归的方法详细解释如何思考以及怎么实现具体功能已经给了后序和中序遍历的结果修改代码使其能够在屏幕上打印结果不需要手动输入
思路:
- 后序遍历的最后一个元素即为根节点,在中序遍历中找到根节点的位置,将其分为左子树和右子树。
- 递归处理左子树和右子树,直到只有一个节点时返回。
- 每次处理完左子树后,将左子树的根节点入栈,以备后续处理右子树时使用。
- 最后输出栈中的元素,即为前序遍历结果。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct TreeNode {
char data;
struct TreeNode *left, *right;
} TreeNode;
typedef struct Stack {
TreeNode *data[MAX_SIZE];
int top;
} Stack;
void push(Stack *s, TreeNode *node) {
if (s->top == MAX_SIZE - 1) {
printf("栈满,无法入栈\n");
return;
}
s->data[++(s->top)] = node;
}
TreeNode *pop(Stack *s) {
if (s->top == -1) {
printf("栈空,无法出栈\n");
return NULL;
}
return s->data[(s->top)--];
}
TreeNode *buildTree(char *inOrder, char *postOrder, int n) {
if (n <= 0) {
return NULL;
}
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root->data = postOrder[n-1];
int i;
for (i = 0; i < n; i++) {
if (inOrder[i] == postOrder[n-1]) {
break;
}
}
root->left = buildTree(inOrder, postOrder, i);
root->right = buildTree(inOrder+i+1, postOrder+i, n-i-1);
return root;
}
void preOrder(TreeNode *root) {
Stack s;
s.top = -1;
push(&s, root);
while (s.top != -1) {
TreeNode *node = pop(&s);
printf("%c ", node->data);
if (node->right) {
push(&s, node->right);
}
if (node->left) {
push(&s, node->left);
}
}
}
int main() {
char inOrder[] = "BDCEAFHG";
char postOrder[] = "DECBHGFA";
TreeNode *root = buildTree(inOrder, postOrder, sizeof(inOrder)/sizeof(char));
printf("前序遍历结果为:");
preOrder(root);
printf("\n");
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/eEzQ 著作权归作者所有。请勿转载和采集!