zoukankan      html  css  js  c++  java
  • C++二叉树值创建于遍历二

    #include <iostream>
    #include <cstdlib>
    #include<queue>
    #include <stack>
    using namespace std;
    
    
    //二叉树链表的存储结构
    typedef struct BiTNode
    {
        int data;//节点数据
        struct BiTNode *lchild, *rchild;//左右孩子指针
    }BiTNode, *BiTree;
    //二叉树的建立
    void CreatBiTree(BiTree &T)
    {
        int  ch;
        cin >> ch;
        if (ch == 0)
            T = NULL;
        else
        {
            T = new BiTNode;//生成根节点
            if (!T)
                exit(1);
            T->data = ch;
            CreatBiTree(T->lchild); //构造左子树
            CreatBiTree(T->rchild); //构造右子树
        }
    }
    //创建二叉树
    BiTNode* create(int b[], int n)
    {
        BiTNode* ptree =new  BiTNode  [n];
        int i;
        for (i = 0; i < n; i++)
        {
            ptree[i].data = b[i];//给每个节点赋值
            ptree[i].lchild = NULL;//
            ptree[i].rchild = NULL;
        }
        for (i = 0; 2*i+1<n; i++)//原来的父亲节点范围为[1,n/2],所以要取到n/2
        {
            ptree[i].lchild = &ptree[2 * i + 1];//把第2*i+1个结点的地址赋给左孩子
            ptree[i].rchild = &ptree[2 * i + 2];//把第2*i+2个结点的地址赋给右孩子
        }
        return  ptree;
    }
    //前序遍历
    void PreOrderTraverse(BiTNode* T)
    {
        if (!T)
            return;
        cout << T->data<<" ";//显示节点数据
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
    //中序遍历
    void InOrderTraverse(BiTree T)
    {
        if (!T)
            return;
        InOrderTraverse(T->lchild);
        cout << T->data << " "; //显示节点数据
        InOrderTraverse(T->rchild);
    }
    //后序遍历
    void PostOrderTraverse(BiTree T)
    {
        if (!T)
            return;
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout << T->data << " "; //显示节点数据
    }
    void Levelorder(BiTNode *T)//层析遍历
    {
        if (!T)
            return;
        BiTNode *temp;
        queue<BiTNode*>q;
        q.push(T);
        while (!q.empty())
        {
            temp = q.front();
            cout << temp->data << " ";
            if (temp->lchild)
                q.push(temp->lchild);
            if (temp->rchild)
                q.push(temp->rchild);
            q.pop();
        }
    }
    
    int main()
    {
        
        
        BiTNode *T=NULL;
        BiTNode *T1;
        int a[7] = { 1,2,3,4,5,6,7};
        int n = size(a);
        T1=create(a, n);
        cout << "前序排序:";
        Levelorder(T1);//层析遍历
        cout << endl;
        cout << "前序排序:";
        PreOrderTraverse(T1); //前序排序
        cout << endl;
        cout << "中序排序:";
        InOrderTraverse(T1); //中序排序
        cout << endl;
        cout << "后序排序:";
        PostOrderTraverse(T1); //后序排序
        cout << endl;
        return 0;
    }
  • 相关阅读:
    (笔记)Linux内核学习(二)之进程
    (笔记)Linux内核学习(一)之内核介绍
    状态机思路在程序设计中的应用
    内存操作函数memmove,memcpy,memset
    linux下常用的几个时间函数:time,gettimeofday,clock_gettime,_ftime
    Camera ISO、快门、光圈、曝光这几个概念
    C语言中的指针和内存泄漏几种情况
    音视频文件码率与大小计算
    CC++中 fopen中文件打开方式的区别:
    常用DOS命令
  • 原文地址:https://www.cnblogs.com/hsy1941/p/11928207.html
Copyright © 2011-2022 走看看