如何修改用C语言编写的树遍历程序,使其不依赖于递归?

时间:2019-09-23 00:24:54

标签: c recursion tree

我有一个用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; 
} 

2 个答案:

答案 0 :(得分:1)

由于列表节点没有指向其父节点的指针,因此使此问题变得很困难。当迭代/命令过程沿当前节点的左或右链接前进以导航到另一个节点时,它没有反向路径。

有两种一般的解决方法:

  1. 维护一个显式堆栈,该堆栈使该过程可以导航到父级。

  2. 临时更改树本身以提供返回路径。也就是说,暂时使用指向父级的反向指针覆盖leftright链接;然后在返回树时恢复值。

如果树是具有最大深度保证的平衡树,则可以使用较小的固定大小的数组来实现(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()