专业术语:
节点 父节点 根节点 子孙 堂兄弟
深度:
从根节点到最底层节点的层数称为深度
叶子节点:
没有子节点的节点称为叶子节点
非终端节点:
实际就是非叶子节点
度:
子节点的个数称为度
树的分类:
一般树
任意一个节点的子节点个数都不受限制
二叉树
任意一个节点的子节点的个数最多是两个 且子节点的位置不可更改
分类:
一般二叉树
满二叉树
在不添加树的层数的情况下每个子节点都满了不能再多一个节点
完全二叉树
如果只删除了满二叉树最底层最右边的连续若干个节点这样形成的二叉树就是完全二叉树
满二叉树是完全二叉树的一个特例 完全二叉树包含满二叉树
森林
N个互不相交的树的集合
 
树的存储:
二叉树的存储
连续存储[完全二叉树] 数组存储方式
优点 查找某个父节点和子节点(包括判断有无子节点)速度很快
缺点 很耗费内存空间
链式存储[链表存储]
一般树的存储
双亲表示法
求父节点方便
孩子表示法
求子节点方便
双亲孩子表示法
求父节点子节点都方便
二叉树表示法
一般树转二叉树来存储具体转换方法:
设法保证任意一个节点左指针域指向它的第一个孩子节点
右指针域指向它的下一个兄弟节点
只要满足此条件就能把普通树转换成二叉树
一个普通的树转换成二叉树 一定没有右子树
森林的存储
和一般树转换二叉树一样
 
树的操作:
二叉树每个子节点可以没有子节点如果有最多是2个
二叉树遍历分为三种
中序遍历
左根右-----(先遍历左子树-然后是根节点-再然后遍历右子树)
前序遍历
根左右-----(先遍历跟节点-然后是左子树-再然后遍历右子树)
后序遍历
左右根-----(先遍历左子树-然后是右子树-再然后遍历根节点)
已知两种遍历求原始二叉树
通过先中 后中 两种遍历可以推算二叉树的原始二叉树
通过 先后遍历无法还原原始二叉树
 
 
 
 
 #ifndef __MYBTREE_H__
#define __MYBTREE_H__
#include <Windows.h>
class Monster
{
public:
int ID;
int Level;
char Name[];
public:
Monster(){}
Monster(int ID,int Level,char* Name)
{
this->ID = ID;
this->Level = Level;
memcpy(&this->Name,Name,strlen(Name)+);
}
}; template<class T>
class TreeNode{
public:
T element; //当前节点存储的数据
TreeNode<T>* pLeft; //指向左子节点的指针
TreeNode<T>* pRight; //指向右子节点的指针 TreeNode(T& ele){
//初始化Node节点
memset(&element,,sizeof(TreeNode));
//为元素赋值
memcpy(&element,&ele,sizeof(T));
pLeft = pRight = NULL;
}
}; template<class T>
class BSortTree{
public:
BSortTree(); //构造函数
~BSortTree(); //析构函数
public:
void InOrderTraverse(TreeNode<T>* pNode); //中序遍历
void PreOrderTraverse(TreeNode<T>* pNode); //前序遍历
void PostOrderTraverse(TreeNode<T>* pNode); //后序遍历
TreeNode<T>* GetRoot(); //返回根节点
int GetDepth(TreeNode<T>* pNode); //返回某个节点的高度/深度
void clear(TreeNode<T>* pNode); //清空所有节点
private:
void Init();
private:
TreeNode<T>* m_pRoot; //根结点指针
int size; //树中元素总个数
}; template<class T>
BSortTree<T>::BSortTree()
{
Init();
}
template<class T>
BSortTree<T>::~BSortTree(){ //释放所以节点空间
if (NULL != m_pRoot)
{
clear(m_pRoot);
} }
template<class T>
void BSortTree<T>::clear(TreeNode<T>* pNode) //清空所有节点
{
if (NULL != pNode)
{
clear(pNode->pLeft);
clear(pNode->pRight);
delete pNode;
pNode = NULL;
}
}
template<class T>
void BSortTree<T>::Init()
{ Monster m1(,,"刺猬");
Monster m2(,,"野狼");
Monster m3(,,"野猪");
Monster m4(,,"士兵");
Monster m5(,,"火龙");
Monster m6(,,"独角兽");
Monster m7(,,"江湖大盗"); TreeNode<Monster>* n1 = new TreeNode<Monster>(m1);
TreeNode<Monster>* n2 = new TreeNode<Monster>(m2);
TreeNode<Monster>* n3 = new TreeNode<Monster>(m3);
TreeNode<Monster>* n4 = new TreeNode<Monster>(m4);
TreeNode<Monster>* n5 = new TreeNode<Monster>(m5);
TreeNode<Monster>* n6 = new TreeNode<Monster>(m6);
TreeNode<Monster>* n7 = new TreeNode<Monster>(m7); m_pRoot = n5;
n5->pLeft = n4;
n5->pRight = n6;
n4->pLeft = n1;
n1->pRight = n2;
n6->pLeft = n3;
n3->pRight = n7;
size = ;
/*
5 4 6 1 3 2 7 */
}
template<class T>
TreeNode<T>* BSortTree<T>::GetRoot()
{
return m_pRoot;
}
template<class T>
int BSortTree<T>::GetDepth(TreeNode<T>* pNode)
{
if(pNode==NULL)
{
return ;
}
else
{
int m = GetDepth(pNode->pLeft);
int n = GetDepth(pNode->pRight);
return (m > n) ? (m+) : (n+);
}
}
template<class T>
void BSortTree<T>::InOrderTraverse(TreeNode<T>* pNode)
{
//中序遍历所有怪物,列出怪的名字
if (NULL != pNode)
{
InOrderTraverse(pNode->pLeft);
printf("%s--%d\r\n",((Monster)pNode->element).Name,((Monster)pNode->element).ID);
InOrderTraverse(pNode->pRight);
} } template<class T>
void BSortTree<T>::PreOrderTraverse(TreeNode<T>* pNode)
{ //前序遍历所有怪物,列出怪的名字
if (NULL != pNode)
{
printf("%s--%d\r\n",((Monster)pNode->element).Name,((Monster)pNode->element).ID);
PreOrderTraverse(pNode->pLeft);
PreOrderTraverse(pNode->pRight); } } template<class T>
void BSortTree<T>::PostOrderTraverse(TreeNode<T>* pNode)
{ //后序遍历所有怪物,列出怪的名字
if (NULL != pNode)
{
PostOrderTraverse(pNode->pLeft);
PostOrderTraverse(pNode->pRight);
printf("%s--%d\r\n",((Monster)pNode->element).Name,((Monster)pNode->element).ID); } }
#endif //__MYBTREE_H__

调用的例子

 #include <stdio.h>
#include <stdlib.h>
#include "MyBTree.h"
#include <stack>
int main(void)
{
Stack<BSortTree> BSortTree<Monster>* P =new BSortTree<Monster>();
P->InOrderTraverse(P->GetRoot());
printf("-----------------------\r\n");
P->PreOrderTraverse(P->GetRoot());
printf("-----------------------\r\n");
P->PostOrderTraverse(P->GetRoot());
delete P;
system("pause");
return ;
}

c++简单实现二叉树的更多相关文章

  1. golang简单实现二叉树的数据添加和遍历

    代码实现 package tree import "fmt" type Node struct { elem interface{} left, right *Node } typ ...

  2. C#实现二叉树的各种遍历

    1. 引言 在实际的项目中,树还是用的比较多的一种,尤其是对于具有层次结构的数据.相信很多人都学过树的遍历,比如先序遍历,后序遍历等,利用递归还是很容易理解的. 今天给大家介绍下二叉树的几种遍历算法, ...

  3. 九度oj 1184 二叉树遍历

    原题链接:http://ac.jobdu.com/problem.php?pid=1184 简单的二叉树重建,遍历. 如下: #include<cstdio> #include<cs ...

  4. [九度OJ]1078.二叉树的遍历(重建)

    原题链接:http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其 ...

  5. Invert a binary tree 翻转一棵二叉树

    Invert a binary tree 翻转一棵二叉树 假设有如下一棵二叉树: 4  / \   2    7  / \   / \ 1  3 6  9翻转后: 4     /    \    7 ...

  6. [数据结构]C语言二叉树的实现

    树和图是数据结构中比较麻烦的东西,里面涉及的概念比较多,也最有用, 就比如一般树广泛应用于人工智能的博弈上,而基于图的广度优先和深度优先搜索也广泛应用于人工智能寻路上面 首先我们要把树进行分类: &g ...

  7. List集合就这么简单【源码剖析】

    前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识. 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是 ...

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

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

  9. 二叉树的遍历--C#程序举例二叉树的遍历

    二叉树的遍历--C#程序举例二叉树的遍历 关于二叉树的介绍笨男孩前面写过一篇博客 二叉树的简单介绍以及二叉树的存储结构 遍历方案 二叉树的遍历分为以下三种: 先序遍历:遍历顺序规则为[根左右] 中序遍 ...

随机推荐

  1. 关于Lattice Planner规划算法的若干问答

    Apollo问答 | 关于Lattice Planner规划算法的若干问答   上周,我们在Apollo开发者交流群内做了关于Lattice Planner的分享.这里,我们将社群分享里开发者提出的问 ...

  2. 64位Linux编译C代码,crt1.o文件格式不对的问题

    今天在某台64位LInux下编译一个简单的hello world的C程序,报错: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../crt1.o: cou ...

  3. LeetCode54 Spiral Matrix

    题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...

  4. HZOJ 随

    这个题的题解并不想写……一个写的很详细的blog 第1个测试点:mod=2,a[i]<mod(仔细看题),则n个数字都是1,直接输出1即可. 第2个测试点:每次乘上去的数字只有一种选择,快速幂即 ...

  5. console.log详细介绍

    console.log详细介绍 效果图: 代码如下: console.log("%c hello world!:http://www.baidu.com","color: ...

  6. ORA-01089: 即時シャットダウン処理中 - 操作はできません

    一:当时的情景 SQL> shutdown immediate --无任何返回结果 二:问题定位过程 1.查询相关进程只有ORACLE的关键进程存在 ps -ef |grep ora_ soad ...

  7. php 第三方登录总结OAuth协议

  8. windows 关闭端口被占用脚本

    cmd 关闭进程java taskkill /F /IM java.exe taskkill /f /im java.exe 如何用dat批处理文件关闭某端口对应程序-Windows自动化命令 如何用 ...

  9. 开源CMS比较

    PHP-CMS的发展方向:简单,易用,美观  http://www.php-cms.cn/ 看点1,服务器一键安装,鼠标点点就搞定:输入数据库参数,在服务器上点一个按钮就完成全部的安装.简单配置一下网 ...

  10. 用CSS画平行四边形

    <div class="jx">我是一个平行四边形</div> <style> .jx{ //定义div的高度宽度 transform:skew ...