我有一个用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;
}
答案 0 :(得分:1)
由于列表节点没有指向其父节点的指针,因此使此问题变得很困难。当迭代/命令过程沿当前节点的左或右链接前进以导航到另一个节点时,它没有反向路径。
有两种一般的解决方法:
维护一个显式堆栈,该堆栈使该过程可以导航到父级。
临时更改树本身以提供返回路径。也就是说,暂时使用指向父级的反向指针覆盖left
和right
链接;然后在返回树时恢复值。
如果树是具有最大深度保证的平衡树,则可以使用较小的固定大小的数组来实现(1)。
答案 1 :(得分:0)
您可以使用堆栈来存储父节点和数组,如果节点先前已处理过或之前未处理过。订单示例
push(root)
while stack is not empty()
parent=stack.top()
if parent->left and done[parent->left]==false
left=parent->left
push(parent)
done[left]=true
continue
if done[parent]==false
process(parent)
done[parent]=true
if parent->right and done[parent->right]==false
right=parent->right
push(right)
done[right]=true
continue
stack.pop()