body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

建立一个二叉树,输入字符 '#' 表示该根结点为空,建二叉树采用递归思想,
  1、先输入根结点
  2、输入左子树
  3、输入右子树
其中第二步和第三步转去从第一步开始,直到输入流耗尽
图一:
前序遍历:abc
中序遍历:bac
后序遍历:bca
图二:
前序遍历:ABCDEF
中序遍历:CBAEDF
后序遍历:CBEFDA
//二叉树
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
typedef struct BinaryTreeNode  //二叉树结点数据结构
{
        char data; 
        struct BinaryTreeNode* lchild;
        struct BinaryTreeNode* rchild;
}BTNode,*pBTNode;
//创建一个二叉树
int createBinaryTree(pBTNode& root);
//二叉树的三种遍历
void preorderTraversal(pBTNode& root);  //前序遍历,根左右
void inorderTraversal(pBTNode& root);  //中序遍历,左根右
void postorderTraversal(pBTNode& root);  //后序遍历,左右根
int createBinaryTree(pBTNode& root)
{
        char data;
        if(cin>>data)  //不能是while, 不然递归一直再while循环,直到流错误
        {
                if('#'==data)  //如果输入数据字符为‘#’表示根结点为空
                        root = NULL;
                else
                {
                        root = new BTNode();
                        root->data = data;
                        createBinaryTree(root->lchild);  //递归建立左子树
                        createBinaryTree(root->rchild);  //递归建立右子树
                }
        }
        return 0;
}
void preorderTraversal(pBTNode& root)
{
        if(NULL==root)
                return ;
        cout<<root->data<<" ";  //前序遍历输出根结点数据
        preorderTraversal(root->lchild);  //前序遍历左子树
        preorderTraversal(root->rchild);  //前序遍历右子树
}
void inorderTraversal(pBTNode& root)
{
        if(NULL==root)
                return ;
        inorderTraversal(root->lchild);  //中序遍历左子树
        cout<<root->data<<" ";  //中序遍历输出根结点数据
        inorderTraversal(root->rchild);  //中序遍历右子树
}
void postorderTraversal(pBTNode& root)
{
        if(NULL==root)
                return ;
        postorderTraversal(root->lchild);  //后序遍历左子树
        postorderTraversal(root->rchild);  //后序遍历右子树
        cout<<root->data<<" ";  //后序遍历输出根结点数据
}
int main()
{
        do{
                BTNode* root;  //给定一个根结点指针
                createBinaryTree(root);
                cout<<"preorder traversal:"<<endl;
                preorderTraversal(root);
                cout<<endl<<endl;
                cout<<"inorder traversal:"<<endl;
                inorderTraversal(root);
                cout<<endl<<endl;;
                cout<<"postorder traversal:"<<endl;
                postorderTraversal(root);
                cout<<endl<<endl;;
        }while(cout<<"continue?(Y/N):",fflush(stdin),getchar()=='Y');
        system("pause");
}

二叉树实现,C++语言描述的更多相关文章

  1. 【数据结构】之二叉树(Java语言描述)

    有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...

  2. 表达式求值(二叉树方法/C++语言描述)(二)

    表达式二叉树节点的数据可能是运算数或运算符,可以使用一个联合体进行存储:同时还需要一个变量来指示存储的是运算数还是运算符,可以采用和栈方法求值中一样的枚举类型TokenType: typedef en ...

  3. 表达式求值(二叉树方法/C++语言描述)(五)

    本例中的二叉树图是使用Graphviz绘制的(Graphviz官网),在Ubuntu Linux下可以使用apt-get命令安装它: sudo apt-get install graphviz 表达式 ...

  4. 表达式求值(二叉树方法/C++语言描述)(三)

    二叉树方法求值对运算数处理的方法与栈方法求值不太相同,除了将字符串中的运算数转换为浮点类型外,还需要生成新的节点: void Calculator::dealWithNumber(char *& ...

  5. 表达式求值(二叉树方法/C++语言描述)(一)

    使用二叉树对算数表达式(以下简称为表达式)进行求值,实质上是将表达式转换为二叉树,对其进行后序遍历,得到后缀表达式的同时可以求得表达式的值.转换和求值的过程也需要借助数据结构栈的帮助. 二叉树数据结构 ...

  6. 表达式求值(二叉树方法/C++语言描述)(四)

    代码清单 // binarytree.h #ifndef BINARYTREE_H #define BINARYTREE_H template <typename T> class Bin ...

  7. 《数据结构与算法分析:C语言描述》读书笔记

    我们数据结构的课用了这本英文教材,作者是Mark Allen Weiss.总体来说比<算法导论>简单很多,但内容上交集非常大.其实是因为去掉了大多数证明和数学,对于没有耐心看符号和公式的人 ...

  8. 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)

    数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...

  9. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  10. 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

    三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...

随机推荐

  1. Mac 如何安装 chromedriver

    1.使用brew  命令 前提是要安装 brew 这里不做介绍 使用命令 brew install chromedriver 如上图出现错误,根据提示可以使用如下命令安装 brew cask inst ...

  2. Android 如何将手机屏幕投影到 PC 屏幕上或者投影仪上做演示?

    Android 如何将手机屏幕投影到 PC 屏幕上或者投影仪上做演示? 公司开发款APP,要给领导演示,总不能用手机面对面演示吧.所以找了好久,找到一款体验超好的: Total Control-帮助你 ...

  3. layui: 子iframe关闭/传值/刷新父页面

    https://www.cnblogs.com/jiqing9006/p/5135697.html layer iframe层的使用,传参   父层 <div class="col-x ...

  4. centos7:mysql-5.7.23安装(二进制安装)

    mysql有二进制码安装,和源码编译安装(mysql5.5使用cmake安装,mysql5.7需要安装boost依赖安装),因为boost依赖安装麻烦,所以用二进制码安装 MySql 5.7.23安装 ...

  5. highly variable gene | 高变异基因的选择 | feature selection | 特征选择

    在做单细胞的时候,有很多基因属于noise,就是变化没有规律,或者无显著变化的基因.在后续分析之前,我们需要把它们去掉. 以下是一种找出highly variable gene的方法: The fea ...

  6. spring boot ----> 和mybatis。。。

    环境: centos6.8,jdk1.8.0_172,maven3.5.4,spring boot1.5.15 1.使用maven命令:mvn dependency:tree查看mybatis-spr ...

  7. 新项目的vue组件

    项目地址:http://pan.baidu.com/s/1qYIxCXu 很久没有写博客的原因的是之前一直在解决一个问题,这个问题就是:我们在写组件的时候,官方推荐把css写在组件里面,但是如果我们写 ...

  8. win10系统同时安装python2和python3

    1.官网下载python2和python3版本 2.安装python3,勾上Add Python3.5 to PATH,自定义选择安装目录,安装,验证:WIN+R--->cmd,输入python ...

  9. PHP const关键字

    常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量).常量默认大小写敏感.通常常量标识符总是大写的. 可以用define()函数来定义常量.在php5.3.0以后 ...

  10. vue嵌套路由--params传递参数

    在嵌套路由中,父路由向子路由传值除了query外,还有params,params传值有两种情况,一种是值在url中显示,另一种是值不显示在url中. 1.显示在url中index.html <d ...