二叉树遍历C语言实现

一、二叉树遍历

这里不细说原理了,如果不懂原理,赶紧去找Googe Baidu吧!别让他们等太久了 🏃! 接下来直接上代码了 GitHub

二、Code
typedef struct BinaryNode{
    char value;
    struct BinaryNode *lChild;
    struct BinaryNode *rChild;
}BinaryNode,*BinaryTree;

1.前序遍历
//前序遍历
//递归实现
void PreorderRecursionTraversal(BinaryTree T){
    if (NULL != T) {
        printf("%c ",T->value);
        PreorderRecursionTraversal(T->lChild);
        PreorderRecursionTraversal(T->rChild);
    }
}

//非递归实现
void PreorderTraversal(BinaryTree T){
    std::stack<BinaryTree> stack;
    BinaryTree p=T;
    while (NULL!=p || !stack.empty()) {
        if (NULL != p) {
            stack.push(p);
            printf("%c ",p->value);
            p=p->lChild;
        }else{
            p=stack.top();
            stack.pop();
            p=p->rChild;
        }
    }
}
2.中序遍历
//中序遍历
//递归实现
void InorderRecursionTraversal(BinaryTree T){
    if (NULL != T) {
        InorderRecursionTraversal(T->lChild);
        printf("%c ",T->value);
        InorderRecursionTraversal(T->rChild);
    }
}

//非递归实现
void InorderTraversal(BinaryTree T){
    std::stack<BinaryTree> stack;
    BinaryTree p=T;
    while (NULL!=p || !stack.empty()) {
        if (NULL != p) {
            stack.push(p);
            p=p->lChild;
        }else{
            p=stack.top();
            printf("%c ",p->value);
            stack.pop();
            p=p->rChild;
        }
    }
}
3.后序遍历
//后序遍历
//递归实现
void PostorderRecursionTraversal(BinaryTree T){
    if (NULL != T) {
        PostorderRecursionTraversal(T->lChild);
        PostorderRecursionTraversal(T->rChild);
        printf("%c ",T->value);
    }
}

//非递归实现(完全想不到思路,参考网上的)
typedef struct BinaryAuxiliaryNode{
    BinaryNode *node;
    char flag;
}BinaryAuxiliaryNode,*BinaryAuxiliaryTree;


void PostorderTraversal(BinaryTree T){
    std::stack<BinaryAuxiliaryTree> stack;
    BinaryTree p=T;
    BinaryAuxiliaryTree aTree;
    while (NULL!=p || !stack.empty()) {
        //遍历左子树
        while (NULL != p) {
            aTree=(BinaryAuxiliaryTree)malloc(sizeof(BinaryAuxiliaryNode));
            aTree->node=p;
            //访问过左子树
            aTree->flag='L';
            stack.push(aTree);
            p=p->lChild;
        }
        //左右子树访问完毕,访问根结点
        while (!stack.empty() && stack.top()->flag=='R') {
            aTree=stack.top();
            stack.pop();
            printf("%c ",aTree->node->value);
        }
        //遍历右子树
        if (!stack.empty()) {
            aTree=stack.top();
            //访问过右子树
            aTree->flag='R';
            p=aTree->node;
            p=p->rChild;
        }
    }
    
}
三、测试
测试
四、总结
  1. 其实二叉树的遍历,只有后续遍历的非递归实现复杂一些,其他的实现代码都很简洁。
  2. 如果初学二叉树,可以拿出笔纸一步一步模拟代码的执行流程,写出遍历结果。
  3. 还有一点想提的就是要学会运用辅助空间来解决问题,当然根据实际情况也有不同,比如程序由于某些因素限制(比如内存...),无法使用辅助空间
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,501评论 1 31
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,534评论 0 14
  • 二叉树的遍历想必大家都不陌生,主要有三种遍历方式:前序遍历(pre-order traversal),中序遍历(i...
    akak18183阅读 1,142评论 0 1
  • 二叉树的三种常用遍历方式 学习过数据结构的同学都清楚,除了层序遍历外,二叉树主要有三种遍历方式: 1. 先序遍历...
    SherlockBlaze阅读 1,247评论 0 4
  • Blessed is he whose fame does not outshine his truth. 名声不...
    我是呜呜阅读 439评论 0 1