#include <iostream>
using namespace std;
//二叉树结点
typedef struct BitNode               
{
    char ch;
    struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
//创建链式队列的方法
/*
typedef struct QNode
{
    BitNode *tree;
    struct QNode *next;
}QNode,*Queueptr;
typedef struct
{
    Queueptr fro;
    Queueptr rear;
}LinkQueue;
*/
//按照先序创建二叉树
void CreatBitTree(BitTree &T)
{
    char c;
    cin>>c;
    if(c=='#')
        T = NULL;
    else
    {
        T = new BitNode;
        T -> ch = c;
        CreatBitTree(T -> lchild);
        CreatBitTree(T -> rchild);
    }
}
//将二叉树按照先序输出
void Print1(BitTree T)
{
    if(T != NULL)
    {
        cout<<T -> ch;
        Print1(T -> lchild);
        Print1(T -> rchild);
    }
}
//将二叉树按照中序输出
void Print2(BitTree T)
{
    if(T != NULL)
    {
        Print2(T -> lchild);
        cout<<T -> ch;
        Print2(T -> rchild);
    }
}
//将二叉树按照后序输出
void Print3(BitTree T)
{
    if(T != NULL)
    {
        Print3(T -> lchild);
        Print3(T -> rchild);
        cout<<T -> ch;
    }
}
//将二叉树按照层次输出
void Print4(BitTree T)
{
    int m=10,i=0,fro=0,rear=0;
    BitTree *a = new BitTree[m];
    BitNode *t,*t1;
    a[rear] = T;
    cout<<a[rear] -> ch;
    rear = (rear+1)%(m+1);      //最大a[10]
    while(fro != rear)
    {
        t = a[fro];
        fro = (fro+1)%(m+1);      //读取一个双亲并删除
        if(t -> lchild)
        {
            t1 = t -> lchild;
            a[rear] = t1;
            rear = (rear+1)%(m+1);
            cout<<t1 -> ch;
        }
        if(t -> rchild)
        {
            t1 = t -> rchild;
            a[rear] = t1;
            rear = (rear+1)%(m+1);
            cout<<t1 -> ch;
        }
    }
}
int Show(BitTree T)
{
    int n;
    cout<<"请输入遍历的顺序 1:先序遍历 2:中序遍历 3:后序遍历 4:层次遍历 5:退出程序"<<endl;
    cin>>n;
    switch(n)
    {
    case 1:
        {
            Print1(T);
            cout<<endl;
        }
        break;
    case 2:
        {
            Print2(T);
            cout<<endl;
        }
        break;
    case 3:
        {
            Print3(T);
            cout<<endl;
        }
        break;
    case 4:
        {
            Print4(T);
            cout<<endl;
        }
        break;
    case 5:
        {
            cout<<"程序退出成功"<<endl;
            return 0;
        }
        break;
    default:
        cout<<"输入有误,重新输入"<<endl;
        break;
    }
}
int main()
{
    int m=1;
    cout<<"请按照先序输入:"<<endl;
    BitTree T;
    CreatBitTree(T);
    while(m!=0)
    {
      m=Show(T);
    }
    return 0;
}
/*
测试用例
ABC##DE#G##F###
*/

二叉树的创建一数据结构一C++的更多相关文章

  1. 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历

    根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...

  2. c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  3. 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)

    要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...

  4. JS实现二叉树的创建和遍历

    1.先说二叉树的遍历,遍历方式: 前序遍历:先遍历根结点,然后左子树,再右子树 中序遍历:先遍历左子树,然后根结点,再右子树 后续遍历:先遍历左子树,然后右子树,再根结点   上代码:主要还是利用递归 ...

  5. java 二叉树的创建 遍历

    本来说复习一下BFS和DFS,辗转就来到了二叉树...本文包括二叉树的创建和遍历 概念 数据:1 2 3 4 5 6 7生成一颗二叉树 上面的数是数据,不是位置,要区别一下数据和位置 红色的代表位置, ...

  6. [PHP] 数据结构-二叉树的创建PHP实现

    1.利用递归的原理,只不过在原来打印结点的地方,改成了生成结点,给结点赋值的操作if(ch=='#'){*T=NULL;}else{malloc();(*T)->data=ch;createFu ...

  7. Java实现二叉树的创建和遍历操作(有更新)

    博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...

  8. C语言实现二叉树的创建&遍历

    算法思想(重点是递归的使用)  利用扩展先序遍历序列创建二叉链表 采用类似先序遍历的递归算法,首先读入当前根结点的数据,如果是'.'则将当前 树根置为空,否则申请一个新结点,存入当前根结点的数据,分别 ...

  9. 剑指offer十七姊妹篇之二叉树的创建、遍历、判断子二叉树

    1.二叉树节点类 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tr ...

随机推荐

  1. Goroutine被动调度之一(18)

    本文是<Go语言调度器源代码情景分析>系列的第18篇,也是第四章<Goroutine被动调度>的第1小节. 前一章我们详细分析了调度器的调度策略,即调度器如何选取下一个进入运行 ...

  2. 关于 <meta name="viewport" content="width=device-width, initial-scale=1.0">的解释

    对于移动开发来讲,我还不太熟悉.今天在github上荡了一个系统源码,进行分析.发现其中有这样一段话: <meta name="viewport" content=" ...

  3. python 字符串操作一

    一.创建字符串 >>> s1 = '12345' >>> s1 '12345' >>> s2 = str(12345) >>> ...

  4. (4)javascript的运算符以及运算符的优先级

                                    运算符的使用方法 在javascript的程序中要完成各种各样的运算,是离不开运算符的. 在javascript中,按运算符类型可以分为 ...

  5. 洛谷p1955[NOI2015]程序自动分析

    题目: 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...

  6. Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道

    题目传送门 /* 最小生成树(Kruskal):以权值为头,带入两个端点,自然的排序;感觉结构体的并查集很好看 注意:题目老头要的是两个农田的高度差,中文水平不好,题意理解成和平均值的高度差! */ ...

  7. NFS与AutoNFS实例

    NFS概述: NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文 ...

  8. 对js 面对对象编程的一些简单的理解

    由简单开始深入: 最简单的 直接对象开始 var desen = { age:24, name:'xyf', job:'fontEnd', getName:function(){ console.lo ...

  9. ES6学习笔记(3)----字符串的扩展

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 字符串的扩展ES6之前只能识别\u0000 - \uFFFF 之间的字符,超过此范围,识别会出错 ...

  10. laravel学习笔记(一)

    laravel 简述 优点:优雅.简洁.工程化(项目架构,协同开发) 版本:2011 June 1.0 ,LTS(long time) ,laravel 5.4 功能:队列.搜索.数据库搜索.定时脚本 ...