• 简单遍历二叉树


    /* 先序创建一棵任意二叉树 */
    /* 注意:输入数据的顺序很有特点,本题输入的顺序要求为,先是根节点,再是左子树,再是右子树 */

    #include <iostream>
    #include <malloc.h>
    using namespace std;

    typedef int ElementType; //给int起别名为ElementType, typedef是起别名的意思
    typedef struct bitnode //定义二叉树节点数据类型
    {
    ElementType data;
    struct bitnode *left, *right;
    } bitnode, *bitree; //bitree为指向bitnode这种结构的指针

    //先序创建一棵二叉树
    bitree PerCreateTree()
    {
    bitree T;
    ElementType item;
    cin >> item;
    if( item == 0 ) //叶节点数据标志:其后根两个0
    T = NULL; //若某一节点为叶子结点,则其左右子树均为NULL,0表示建空树
    else
    {
    T = (bitree)malloc(sizeof(bitnode));
    T->data = item;

    T->left = PerCreateTree(); //递归创建其左子树
    T->right = PerCreateTree(); //递归创建其右子树
    }

    return T; //返回根节点
    }

    //先序递归遍历二叉树
    void PerOrder(bitree T)
    {
    if( T ) // T != NULL
    {
    cout << T->data << " ";
    PerOrder(T->left); //递归先序周游其左子树
    PerOrder(T->right); //递归先序周游其右子树
    }
    }

    void InOrder(bitree T)
    {
    if(T)
    {
    InOrder(T->left);
    cout<<T->data<<" ";
    InOrder(T->right);
    }
    }


    void inorder(bitree T)
    {
    //还是模拟上面的遍历过程
    bitree ptr[20];
    int top = -1;
    /*下面的双重判断和前面的一样,在进栈、出栈的过程中可能会出现栈空的情况,而此时的遍历还没有结束,
    所以需要据此来维持循环的进行。*/
    while(T || top!=-1)
    {
    while(T)
    {
    ptr[++top] = T;
    T = T->left;
    }
    if(top!=-1)
    {
    T = ptr[top--];
    cout<<T->data<<" "; //输出在出栈后
    T = T->right;
    }
    }

    }


    //后序递归遍历二叉树
    void PostOrder(bitree T)
    {
    if( T ) // T != NULL
    {
    PostOrder(T->left); //递归先序周游其左子树
    PostOrder(T->right); //递归先序周游其右子树
    cout << T->data << " ";
    }
    }

    //释放空间
    bitree FreeTree(bitree T)
    {
    if( T )
    {
    FreeTree(T->left); //递归释放其左子树
    FreeTree(T->right); //递归释放其右子树

    free(T); //释放根节点
    T = NULL; //释放指向根节点的指针
    }

    return T; //返回释放后的根节点NULL
    }

    int main()
    {
    bitree root;

    cout << "请输入数据先序创建一棵二叉树:";
    root = PerCreateTree(); //先序创建一棵二叉树

    cout << "先序递归遍历的结果:";
    PerOrder(root); //先序递归遍历
    cout << endl;

    cout << "中序递归遍历的结果:";
    InOrder(root); //中序递归遍历
    cout << endl;

    cout << "中序非递归遍历的结果:";
    inorder(root); //中序非递归遍历
    cout << endl;

    cout << "后序递归遍历的结果:";
    PostOrder(root); //后序递归遍历
    cout << endl;

    return 0;
    }

    运行结果:

    请输入数据先序创建一棵二叉树:4 6 8 0 0 1 0 0 2 0 0
    先序递归遍历的结果:4 6 8 1 2
    中序递归遍历的结果:8 6 1 4 2
    中序非递归遍历的结果:8 6 1 4 2
    后序递归遍历的结果:8 1 6 2 4

  • 相关阅读:
    tomcat 服务器的几个重要监听 方法 与 使用
    webSocket 前端 js 加入 心跳机制 的基本写法
    Palinwords (处理回文串)
    Anti-Rhyme Pairs (求最长公共前缀)
    Extend to Palindrome (顺序Hash和逆序Hash处理回文)
    Milk Patterns (hash + 二分)
    次小生成树
    Borg Maze (BFS预处理+最小生成树)
    P1126 机器人搬重物
    P1141 01迷宫 (记忆化搜索)
  • 原文地址:https://www.cnblogs.com/liyajuan333/p/11820823.html
Copyright © 2020-2023  润新知