C++数据结构之二叉树

时间:2022-09-23 18:53:11

之前打算编算法类的程序,但是搞了几次英雄会后,觉得作为一个还在学习阶段的学生,实在是太浪费时间了,并不是没意义,而是我的基础还不牢固啊。所以转变了思路,这个学期打算分别用C++、Python、Java实现数据结构。下个学期再做算法的打算吧。不过Java没学过,可能要一点时间了。

小弟喜欢编程,但是学习高级应用觉得时间长了就都忘了,至今在探索大学阶段该怎么规划,希望大神指教。

用C++实现的二叉树,有递归和非递归两种操作方式,其中非递归只实现了中序遍历,和求树的高度。用了<queue>和<stack>库,以前没有用过STL,现在感觉方便多了。

/********************
Date :2013-9-10
Author :DVD0423
Function:二叉树
样例输入:1-2-4-q-q-5-q-q-3-6-q-q-7-q-q
"q"代表叶子节点的孩子,为先序遍历输入
结果为 :
1
/ \
2 3
/ \ / \
4 5 6 7
/ \
q q... *******************/
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
typedef char DataType;
#define END 'q'
struct Node{
DataType val;
Node *leftChild;
Node *rightChild;
Node():leftChild(NULL),rightChild(NULL){}
void Visit()
{
cout<<"\t"<<val<<endl;
}
}; class BiTree{
public:
//member function
BiTree();
void CreateTree(Node * & ); //创建二叉树
void PreOrder(Node * &); //先序遍历
void InOrder(Node * &); //中序遍历
void PostOrder(Node * &); //后序遍历
int getHeight(Node * &); //求树的高度,
int getLevel(Node * &); //层序遍历,并求高度,非递归借助queue
void NoRecTraverse(Node * &); //中序非递归遍历,借助stack
void Destroy(Node * &); //销毁
~BiTree();
//private:
//data member
Node *root; //根节点
int num;
}; BiTree::BiTree()
{
num=0;
CreateTree(root);
cout<<"节点数一共为:"<<num<<endl; }
void BiTree::CreateTree(Node * &root)
{
DataType e;
cin>>e;
if(e == END)
{
root = NULL;
}
else
{
if((root = new Node) == NULL) //new 开辟内存空间
exit(1);
root->val = e;
num++;
CreateTree(root->leftChild);
CreateTree(root->rightChild);
}
} void BiTree::PreOrder(Node * &root)
{
if(root)
{
root->Visit();
PreOrder(root->leftChild);
PreOrder(root->rightChild);
}
}
void BiTree::InOrder(Node * &root)
{
if(root != NULL)
{
InOrder(root->leftChild);
root->Visit();
InOrder(root->rightChild);
}
}
void BiTree::PostOrder(Node * &root)
{
if(root != NULL)
{
PostOrder(root->leftChild);
PostOrder(root->rightChild);
root->Visit();
}
}
/*
求树高度
*/
//recursion
int BiTree::getHeight(Node * &root)
{
if(root == NULL)
return 0;
else if(getHeight(root->leftChild)>getHeight(root->rightChild))
return getHeight(root->leftChild)+1;
else
return getHeight(root->rightChild)+1;
}
/*
非递归
front为pop的节点,rear为push的节点,last为每层的最右边节点 */
int BiTree::getLevel(Node * &root)
{
int level = 0;
int front = 0, rear = 0, last = 0;
queue<Node *> q;
Node * p = root;
Node * t = NULL;
if(p)
{
q.push(p);
++rear;
++last;
}
while(!q.empty())
{
t = q.front();
q.pop();
++front;
t->Visit(); //层序遍历
if(t->leftChild)
{
q.push(t->leftChild);
++rear;
}
if(t->rightChild)
{
q.push(t->rightChild);
++rear;
}
if(front == last) //访问到每层的最后节点,此时rear也指向下一层的最后节点
{
++level;
last = rear;
}
}
return level;
}
/*
中序
*/
void BiTree::NoRecTraverse(Node * &root)
{
Node *p=root;
stack<Node *> s; while(p || !s.empty())
{
if(p)
{
s.push(p);
p = p->leftChild;
}
else
{
p = s.top();
p->Visit();
s.pop();
p = p->rightChild;
}
}
} void BiTree::Destroy(Node * &root)
{
if(root)
{
Destroy(root->leftChild);
Destroy(root->rightChild);
delete root;
root = NULL; //这一步为规范操作,防止root成为野指针
}
} BiTree::~BiTree()
{
Destroy(root);
}

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

  1. python数据结构之二叉树的统计与转换实例

    python数据结构之二叉树的统计与转换实例 这篇文章主要介绍了python数据结构之二叉树的统计与转换实例,例如统计二叉树的叶子.分支节点,以及二叉树的左右两树互换等,需要的朋友可以参考下 一.获取 ...

  2. python数据结构之二叉树的实现

    树的定义 树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  3. Python数据结构之二叉树

    本来打算一个学期分别用C++.Python.Java实现数据结构,看来要提前了 这个是Python版本,我写的数据结构尽量保持灵活性,本文bt1是一般的插入法建立二叉树结构,bt2就是可以任意输入,至 ...

  4. java数据结构之二叉树的实现

    java二叉树的简单实现,可以简单实现深度为n的二叉树的建立,二叉树的前序遍历,中序遍历,后序遍历输出. /** *数据结构之树的实现 *2016/4/29 * **/ package cn.Link ...

  5. 数据结构之二叉树(BinaryTree)

    导读 二叉树是一种很常见的数据结构,但要注意的是,二叉树并不是树的特殊情况,二叉树与树是两种不一样的数据结构. 目录 一. 二叉树的定义 二.二叉树为何不是特殊的树 三.二叉树的五种基本形态 四.二叉 ...

  6. 数据结构之---二叉树C实现

    学过数据结构的都知道树,那么什么是树? 树(tree)是包含n(n>0)个结点的有穷集,其中: (1)每个元素称为结点(node): (2)有一个特定的结点被称为根结点或树根(root). (3 ...

  7. 算法与数据结构&lpar;三&rpar; 二叉树的遍历及其线索化&lpar;Swift版&rpar;

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  8. 一步一步写数据结构(二叉树的建立和遍历,c&plus;&plus;)

    简述: 二叉树是十分重要的数据结构,主要用来存放数据,并且方便查找等操作,在很多地方有广泛的应用. 二叉树有很多种类,比如线索二叉树,二叉排序树,平衡二叉树等,本文写的是最基础最简单的二叉树. 思路: ...

  9. js数据结构之二叉树的详细实现方法

    数据结构中,二叉树的使用频率非常高,这得益于二叉树优秀的性能. 二叉树是非线性的数据结构,用以存储带有层级的数据,其用于查找的删除的性能非常高. 二叉树 数据结构的实现方法如下: function N ...

随机推荐

  1. Chome v42 支持Java

    从ver42开始,Chrome默认禁用了NPAPI.可以去chrome://flags/#enable-npapi开启,但是google很有可能在9月从代码中彻底移除NPAPIFirefox也有这个意 ...

  2. iOS中计算磁盘缓存文件夹的大小

    SDWebImage框架中在自动做磁盘缓存的过程中,底层实现了计算Cache的大小,框架的方法名称是getSize,但方法不容易被人理解,我就从新写了一下,附带注释 基本思想: 1. 先取出的Cach ...

  3. Interface &equals;&gt&semi; IDataErrorInfo

    Introduction to common Interfaces IDataErrorInfo Provides the functionality to offer custom error in ...

  4. WiFi QC 自动测试:Qt控制无线路由器

    在测试wifi的时候,测试人员一般要使用很多不同型号的AP,并且需要不断地切换Chariot的配置. 这里的思路是致力于提供一个友好的GUI界面来自动控制AP,并且自动控制Chariot进行Throu ...

  5. Linux必学的60个命令【转载】

    Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存  [转载地址]http://blog.chinaunix.net/uid-16728139-id-3154272.ht ...

  6. Linux下一个C基本的编程----写进Blog在那之前

    展望2周的实习吧. 各种酸甜苦辣.由于公司只是广告.毛承保让我去.严重的歧视.想也想开,争夺.结果让它成为.还是把它写自己的学习经验,我有同样的希望和迷茫的同学.少走一点弯路.行.切入正题: 一.參考 ...

  7. Socket 传送文件

    1.传送文本文件 1.1服务端 package com; import java.io.BufferedWriter; import java.io.DataInputStream; import j ...

  8. 设备指纹识别之User Agent 解析

    设备指纹识别之User Agent 解析User Agent 解析 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-4- ...

  9. maven项目管理

    systemPath方式 有些不通用的包,maven仓库没有,只能通过本地包依赖,就像下面方式: 在需要依赖的项目建lib文件夹,如下: 然后在pom.xml项目管理文件里面加入本地依赖,如下 这种情 ...

  10. SpringCloud-day03-服务注册与发现组件Eureka

    5.服务注册与发现组件Eureka 5.1Eureka简介: Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中 ...