二叉树前序、中序、后序非递归遍历实现(C语言)

一、非递归前序遍历

void TreversePreorder(struct BTree *T)
{
    struct BTree *stack[1000],*p=T;
    int top=0;
    while(p||top)
    {
        if(p)
        {
            printf("%d ",p->data);
            stack[top++]=p;
            p=p->left;
        }
        else
        {
            p=stack[--top];
            p=p->right;
        }
    }
}

二、非递归中序遍历

void TreverseInorder(struct BTree *T)
{
    struct BTree *stack[1000],*p=T;
    int top=0;
    while(p||top)
    {
        if(p)
        {
            stack[top++]=p;
            p=p->left;
        }
        else
        {
            p=stack[--top];
            printf("%d ",p->data);
            p=p->right;
        }
    }
}

三、非递归后序遍历

void TreversePostorder(struct BTree *T)
{
    struct BTree *stack[1000],*p=T,*r=NULL;//r记录上一个已经访问节点
    int top=0;
    while(p||top)
    {
        if(p)
        {
            stack[top++]=p;
            p=p->left;
        }
        else
        {
            p=stack[top-1];
            if(p->right&&p->right!=r)//右子树不为空且未被访问则需要压栈
            {
                p=p->right;
                stack[top++]=p;//当前右子树压栈
                p=p->left;//p指向下一个将要访问的节点
            }
            else//右子树为空或者右子树已经被访问
            {
                p=stack[--top];
                printf("%d ",p->data);
                r=p;//r保存节点
                p=NULL;
            }
        }
    }
}
  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是用非递归实现二叉树前序中序后序遍历算法的C语言代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; /* 前序遍历 */ void preorderTraversal(TreeNode* root) { if (root == NULL) return; TreeNode* stack[100]; int top = -1; stack[++top] = root; while (top != -1) { TreeNode* node = stack[top--]; printf("%d ", node->val); if (node->right != NULL) stack[++top] = node->right; if (node->left != NULL) stack[++top] = node->left; } } /* 中序遍历 */ void inorderTraversal(TreeNode* root) { if (root == NULL) return; TreeNode* stack[100]; int top = -1; TreeNode* node = root; while (top != -1 || node != NULL) { while (node != NULL) { stack[++top] = node; node = node->left; } node = stack[top--]; printf("%d ", node->val); node = node->right; } } /* 后序遍历 */ void postorderTraversal(TreeNode* root) { if (root == NULL) return; TreeNode* stack1[100]; TreeNode* stack2[100]; int top1 = -1, top2 = -1; stack1[++top1] = root; while (top1 != -1) { TreeNode* node = stack1[top1--]; stack2[++top2] = node; if (node->left != NULL) stack1[++top1] = node->left; if (node->right != NULL) stack1[++top1] = node->right; } while (top2 != -1) { printf("%d ", stack2[top2--]->val); } } int main() { /* 构造二叉树 */ TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->val = 2; root->left->left = NULL; root->left->right = NULL; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->val = 3; root->right->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right->left->val = 4; root->right->left->left = NULL; root->right->left->right = NULL; root->right->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->right->val = 5; root->right->right->left = NULL; root->right->right->right = NULL; /* 输出遍历结果 */ printf("前序遍历:"); preorderTraversal(root); printf("\n中序遍历:"); inorderTraversal(root); printf("\n后序遍历:"); postorderTraversal(root); printf("\n"); return 0; } ``` 在这个代码中,我们使用了栈来实现非递归遍历二叉树。对于前序遍历,我们先将根节点入栈,然后每次取出栈顶元素,并将其右子节点和左子节点入栈;对于中序遍历,我们先将左子节点全部入栈,再取出栈顶元素,并将其右子节点入栈;对于后序遍历,我们使用两个栈,先将根节点入栈1,然后每次取出栈1的栈顶元素,并将其左子节点和右子节点入栈1,同时将该元素入栈2,最后将栈2中的元素依次出栈即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值