【发布时间】:2019-09-23 00:24:54
【问题描述】:
我有一个用 C 语言编写的程序,它以反向前序、反向中序和反向后序遍历树,其各个函数严重依赖递归。我将如何修改这些函数以使它们执行完全相同的任务但不使用任何递归?我花了很多时间试图通过使用临时存储值的变量来解决这个问题,但不幸的是我一直在画一个空白。我在 Ubuntu Linux BTW 上使用 GCC 编译器。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* left;
struct node* right;
};
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
void reversePostOrder(struct node* node)
{
if (node == NULL)
return;
reversePostOrder(node->right);
reversePostOrder(node->left);
printf("%d ", node->data);
}
void reverseInOrder(struct node* node)
{
if (node == NULL)
return;
reverseInOrder(node->right);
printf("%d ", node->data);
reverseInOrder(node->left);
}
void reversePreOrder(struct node* node)
{
if (node == NULL)
return;
printf("%d ", node->data);
reversePreOrder(node->right);
reversePreOrder(node->left);
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(-2);
root->right = newNode(-3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->right->left =newNode(6);
root->right->right=newNode(7);
root->left->right->left=newNode(-8);
root->left->right->right=newNode(-9);
root->right->right->left=newNode(10);
root->right->right->right=newNode(11);
root->right->right->right->left=newNode(-12);
root->right->right->right->right=newNode(-13);
root->right->right->right->right->left=newNode(14);
printf("\nReverse Preorder traversal of binary tree is \n");
reversePreOrder(root);
printf("\nReverse Inorder traversal of binary tree is \n");
reverseInOrder(root);
printf("\nReverse Postorder traversal of binary tree is \n");
reversePostOrder(root);
getchar();
return 0;
}
【问题讨论】:
-
想想每次递归时每个
node变量是如何存储在堆栈中的,以及当你返回时该变量是如何从堆栈中删除的。您需要一个节点数组,其大小为您希望允许的最大深度、一个深度计数器和一些关于最后一次移动是在该级别是左还是右的内存。