文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言中如何实现二叉树的后序遍历

2023-06-29 00:08

关注

小编给大家分享一下C语言中如何实现二叉树的后序遍历,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

首先我们从两个方面讲解二叉树的后序遍历(递归+迭代)

一.二叉树的后序遍历.(递归)

思想:

首先我们从二叉树的根节点开始先遍历其左孩子,①接着同样继续遍历其左孩子的左孩子,直到某个左孩子节点的左孩子为NULL时,②开始遍历其右孩子,如果其为NULL则访问该节点的值域,并返回其双亲节点重复第二步的操作,如果其不为NULL则以该节点为根节点重复第一步的操作.直到访问完所有节点时结束递归.

代码:

void BTreePostOrder(struct TreeNode* root,int* arry,int* Size){//后序遍历    if(NULL==root){//递归出口        return;    }    BTreePostOrder(root->left,arry,Size);//遍历左孩子    BTreePostOrder(root->right,arry,Size);//遍历右孩子    arry[(*Size)++]=root->val;//访问该节点}

运行过程:(如图)

C语言中如何实现二叉树的后序遍历

二.二叉树的后序遍历(迭代)

我们应该知道二叉树的前中后序遍历使用递归非常的简单,但是如果用迭代的话就比较有难度了,因此我思考了很久有没有一种迭代类型的算法与递归的框架相似(递归的三种算法框架非常相似只要会一个其他的便很好写出来),我们是否可以写出一种迭代算法:只用改变访问结点的次序便可以在迭代的方式下实现二叉树的前中后序遍历,因此我们使用数据结构中栈来模仿递归的形式实现了二叉树的前序遍历(在进栈时访问结点值域),中序遍历(在出栈时访问结点的值域),这种方法可以在同一种框架中实现迭代层面二叉树的前序遍历和中序遍历,但是到了后序遍历就没办法了,之后经过思考前序遍历与后序遍历的关系从而实现了同一种框架中实现前中后序遍历的迭代算法.

相信很多人在刚学习二叉树时都遇到过这种问题,选择题给定一颗二叉树,让我们给出二叉树的前中后序遍历的节点顺序.(每个人都有自己的计算方法),下面说一下我的计算方法.

前序:我们按图中红色箭头的顺序和其指向依次读取箭头上的结点便可得到其前序遍历.

C语言中如何实现二叉树的后序遍历

中序:我们按图中红色箭头的顺序和其指向依次读取箭头上的结点便可得到其中序遍历.

C语言中如何实现二叉树的后序遍历

后序:我们按图中红色箭头的顺序和其指向依次读取箭头上的结点便可得到其后序遍历.

C语言中如何实现二叉树的后序遍历

经过上图我们可以看出二叉树的后序遍历刚好与从右孩子开始的前序遍历所得到的的值完全相反.因此我们可以使用前序遍历的代码从右孩子开始进行前序遍历,最后将得到的值反向打印即可.

代码:

typedef struct TreeNode BTNode; typedef struct Stack{//栈的结构体    BTNode* array[100];    int size;}Stack; void StackPush(Stack* a,BTNode* root){//入栈    a->array[(a->size)++]=root;} void StackPop(Stack* a){//出栈    (a->size)--;} void Reverse(int* a,int Long){//反向打印    int left_1=0;    int right_1=Long-1;    while(left_1 < right_1){        int temp=a[left_1];        a[left_1]=a[right_1];        a[right_1]=temp;        left_1++;        right_1--;    }} int* postorderTraversal(struct TreeNode* root, int* returnSize){//从右孩子开始的前序遍历    int* b=(int*)malloc(sizeof(int)*100);    if(NULL==b){        printf("申请节点失败!\n");        return NULL;    }    Stack a;    a.size=0;    BTNode* root_temp;    int i=0;    StackPush(&a,root);    while(NULL != a.array[a.size-1]){        b[i++]=a.array[a.size-1]->val;        StackPush(&a,a.array[a.size-1]->right);        while(NULL == a.array[a.size-1]){            StackPop(&a);            if(0 == a.size){                Reverse(b,i);                           (*returnSize)=i;                return b;            }            root_temp=a.array[a.size-1];            StackPop(&a);             StackPush(&a,root_temp->left);        }    }    Reverse(b,i);    (*returnSize)=i;    return b;}

从右孩子开始的前序遍历:正常的前序遍历是先访问节点,然后遍历其左孩子,再遍历其右孩子.而该前序遍历是先访问节点,然后遍历其右孩子,再遍历其左孩子.

代码:

void BTreeInOrder(struct TreeNode* root,int* arry,int* Size){//前序遍历    if(NULL==root){//递归出口        return;    }    arry[(*Size)++]=root->val;//访问该节点    BTreeInOrder(root->right,arry,Size);//遍历右孩子    BTreeInOrder(root->left,arry,Size);//遍历左孩子}

具体比较如图:

C语言中如何实现二叉树的后序遍历

看完了这篇文章,相信你对“C语言中如何实现二叉树的后序遍历”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯