• 二叉树的基本操作


    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <stack>

    using namespace std;

    /*****************************************************************
    *Module Name: 简单二叉树1
    *Module Date: 2018.12.11
    *Module Auth: 谭路
    *Description: 二叉树的生成,结点的遍历,结点的删除操作
    *Others: null
    *evision History: null
    *DateRel VerNotes: null
    *XX/XX/XXXXX.X: null
    *****************************************************************/

    typedef char ElemType;

    typedef struct BitNode{
    ElemType date;
    struct BitNode* lchild, rchild;
    }BitNode, *BiTree;

    //前序遍历创建二叉树
    BiTree CreateTree(BiTree t){
    ElemType ch;
    scanf("%d", &ch);

    if('#' == ch){
    t == NULL;
    }
    else {
    t = (BiTree*) malloc(sizeof(BitNode));
    if(NULL == t){
    fprintf(stderr, "malloc error in CreateTree. ");
    }
    else {
    t->date = ch;
    t->lchild = CreateTree(t->lchild);
    t->rchild = CreateTree(t->rchild);
    }
    }
    return t;
    }

    //先序遍历
    void PreOrderTraverse(BiTree t){
    if(NULL != t){
    printf("%c", t->date);
    PreOrderTraverse(t->lchild);
    PreOrderTraverse(t->rchild);
    }
    }

    //后序遍历非递归实现,可以将栈改为自己编写的数据结构
    bool NoPostOrderTraverse(BiTree t){
    stack<BiTree> s;
    if(!s.empty()){
    while(!s.top()){
    s.pop();
    }
    }

    BiTree cur; //当前结点
    BiTree pre = NULL; //前一次访问的结点
    BiTree tmp; //临时结点

    if(NULL == t){
    fprintf(stderr, "the tree is null. ");
    return false;
    }

    s.push(t);
    while(!s.empty()){
    cur = s.top();
    if((cur->lchild == NULL && cur->rchild == NULL) ||
    (pre != NULL && (pre == cur->lchild || pre == cur->rchild)))
    {
    printf("%c", cur->date);
    s.pop();
    pre = cur;
    }
    else {
    if(cur->rchild != NULL){
    s.push(cur->rchild);
    }
    if(cur->lchild != NULL){
    s.push(cur->lchild);
    }
    }
    }
    return true;
    }

    //前序遍历查找需要的数据
    boolean PreOrderTraverse(BiTree t, ElemType date, BitNode *p){
    if(NUll == t){
    if(t->date == date){
    p = t;
    return true;
    }
    else {
    PreOrderTraverse(t->lchild, date, p);
    PreOrderTraverse(t->rchild, date, p);
    }

    }
    }

    // 2018-12-12

  • 相关阅读:
    小吴破产了。。。。
    面试专场之「计算机网络」知识
    硬核!社招校招面试「计算机网络」知识点大集合!
    41 二分查找 (20分)
    我是一个 4 年的 iOSer
    开源者访谈录第 1 期:如何在 3 个月内斩获 14000 个 GitHub Star!
    荐号 | 高质量的 Python 类公众号
    一道看完答案你会觉得很沙雕的「动态规划算法题」
    几道和散列(哈希)表有关的面试题
    面试专场之「Git」知识
  • 原文地址:https://www.cnblogs.com/854594834-YT/p/10106191.html
Copyright © 2020-2023  润新知