美文网首页
二叉树遍历C语言实现

二叉树遍历C语言实现

作者: MangK | 来源:发表于2016-11-04 23:54 被阅读0次
一、二叉树遍历

这里不细说原理了,如果不懂原理,赶紧去找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. 还有一点想提的就是要学会运用辅助空间来解决问题,当然根据实际情况也有不同,比如程序由于某些因素限制(比如内存...),无法使用辅助空间

相关文章

  • 经典算法代码集

    本文是经典算法的集合,使用C#语言来实现。 1. 二叉树 二叉树结构定义 1.1 二叉树的遍历 先定义一个遍历处理...

  • 2018-11-19

    今天在电脑上用c语言实现了二叉树的创建,并且采用递归算法的形式进行二叉树的先序遍历和中序遍历以及后序遍历。

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树递归与非递归 - 代码实现

    前序遍历,中序遍历,后序遍历,层次遍历,深度遍历 参考深度遍历 本质上就是 前序遍历 C++ 实现 二叉树前序、中...

  • 各种二叉树遍历

    C++实现,二叉树的递归、非递归版本的前序、中序、后序遍历。

  • 二叉树的创建和遍历

    二叉树的创建和遍历 如图所示的二叉树,我们用C++来实现其创建和...

  • python实现二叉树

    递归实现二叉树 堆实现二叉树前序遍历

  • Java二叉树的遍历

    Java二叉树的遍历 利用递归和非递归实现二叉树的先序,中序,后序遍历以及使用队列实现二叉树的层次遍历

  • 算法与数据结构系列之[二叉树-下]

    上篇贴出了二叉树的C语言代码实现,这篇贴出Java代码实现。

  • 二叉树的递归遍历(java版)

    1. 场景需求 二叉树如图 java中利用递归实现二叉树的各种遍历 前序遍历 中序遍历 后序遍历 3.代码实现 3...

网友评论

      本文标题:二叉树遍历C语言实现

      本文链接:https://www.haomeiwen.com/subject/jdbwuttx.html