服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言中二叉树的后序遍历详解

C语言中二叉树的后序遍历详解

2022-09-05 14:49guo5411 C/C++

大家好,本篇文章主要讲的是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语言中二叉树的后序遍历详解

 

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

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

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

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

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("申请节点失败!
");
        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语言中二叉树的后序遍历详解的文章就介绍到这了,更多相关C语言二叉树的后序遍历内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_49312527/article/details/122655475

延伸 · 阅读

精彩推荐
  • C/C++Easyx实现窗口自动碰撞的小球

    Easyx实现窗口自动碰撞的小球

    这篇文章主要为大家详细介绍了Easyx实现窗口自动碰撞的小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    shi_xiaobin6572022-08-20
  • C/C++C语言扫雷游戏的简单实现

    C语言扫雷游戏的简单实现

    这篇文章主要为大家详细介绍了C语言扫雷游戏的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    与秋逐鹿3zZ6182022-03-01
  • C/C++使用C++的string实现高精度加法运算的实例代码

    使用C++的string实现高精度加法运算的实例代码

    下面小编就为大家带来一篇使用C++的string实现高精度加法运算的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来...

    C++教程网3942021-04-16
  • C/C++C++有限状态机实现计算器小程序

    C++有限状态机实现计算器小程序

    这篇文章主要为大家详细介绍了C++有限状态机实现计算器小程序的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以...

    砖瓦匠11962021-05-17
  • C/C++Visual Studio C++指针靠前靠后的问题全面解析

    Visual Studio C++指针靠前靠后的问题全面解析

    这篇文章主要介绍了Visual Studio C++指针靠前靠后的问题全面解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可...

    Oberon5192021-10-29
  • C/C++C语言中设置进程优先顺序的方法

    C语言中设置进程优先顺序的方法

    这篇文章主要介绍了C语言中设置进程优先顺序的方法,包括setpriority()函数和getpriority()函数以及nice()函数,需要的朋友可以参考下...

    C语言教程网6912021-03-10
  • C/C++c语言实现多线程动画程序示例

    c语言实现多线程动画程序示例

    这篇文章主要介绍了c语言实现多线程动画程序示例,该程序是利用opengl图形库与fmod音频库写的一个简单3d动画程序,需要的朋友可以参考下...

    C语言程序设计8852021-01-18
  • C/C++C++枚举类型enum与enum class的使用

    C++枚举类型enum与enum class的使用

    这篇文章主要介绍了C++枚举类型enum与enum class的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    冬瓜~11042021-09-24