1. Definiation

What is Binary Trees?

Collection of node (n>=0) and in which no node can have more than two children.

或为空集,或为有一个根节点和两棵互不相交的二叉树组成

左子树与右子树是有顺序的,不能颠倒

即使是只有一颗子树也要分清是左子树还是右子树

2. property

(1)  若二叉树的层次从1开始,则在二叉树的第i 层最多有2^(i-1)个结点;

(2)高度为k 的二叉树最多有2^k-1个结点;

(3)对任一棵二叉树,如果其叶结点个数为n0,度为2的非叶结点个数为n2,则有   n0=n2+1;

(4)具有n个结点的完全二叉树的高度为[logn]+1

(5)

3. 特殊的二叉树

(1)斜树

一波流,要么往左斜,要么往右斜

(2)满二叉树

一颗深度为k且有2^k-1个节点

叶子只能出现在最后一层

(3)完全二叉树

对一颗有n个节点的二叉树编号,如果编号为i的节点与满二叉树的节点编号相同,则这棵树称为完全二叉树

最下层叶子节点一定集中在左部连续

if倒数第二层有叶子节点,则一定在右部连续。

if结点度为一,则一定只有左孩子

同样结点的二叉树,完全二叉树深度是最小的

满二叉树一定是完全二叉树

4、二叉树的储存结构

(1)顺序储存二叉树

完全二叉树

层序遍历,可以用数组表示逻辑结构

一般二叉树

不存在的结点就用^表示

但如果是斜树呢?

显然浪费太多的空间

要考虑用链式存储结构

(2)链式储存二叉树

二叉树最多有两个孩子,设计一个数据域和两个指针域,叫做二叉链表

template<typename Object>
struct bitTree
{
Object data;
bitTree<Object>*lchild, rchild;
};

5、遍历

What is  遍历?

二叉树的遍历(traversing binary tree)从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点有且只被访问一次。

前序遍历:

若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

中序遍历

若树为空,则空操作返回,否则从根结点开始(注并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点,最后中序遍历右子树

后序遍历

若树为空,则空操作返回,否则从左到右线叶子后结点的方式遍历访问左右子树,最后访问根结点

层序遍历

一层一层遍历

6、二叉树的建立与遍历算法

//建立二叉树,并输出每个字符所在层数
#include<iostream>
using namespace std; typedef struct BitNode
{
char data;
struct BitNode *lchild, *rchild;
}BitNode, *BitTree; //创建一棵二叉树,约定用户遵照前序遍历的方式遍历
void CreateBitTree(BitTree *T)
{
char c;
cin>>c; if(c=='-')
{
*T=NULL;
}
else
{
*T=new BitNode();
(*T)->data=c;
CreateBitTree(&((*T)->lchild));
CreateBitTree(&(*T)->rchild));
} } //访问二叉树结点的具体操作
void visit(char data, int level)
{
cout<<data<<" in "<< level << endl;
} //前序遍历二叉树
void PreOrderTraversal(BitTree T, int level)
{
if(T)
{
visit(T->data,level);
PreOrderTraversal(T->lchild,level+1);
PreOrderTraversal(T->rchild,level+1);
}
} //后续遍历删除二叉树
void PostOrderTracersalDelete(BitTree T)
{
if(T)
{
PostOrderTracersalDelete(T->lchild);
PostOrderTracersalDelete(T->rchild);
delete T;
}
} void play(char data)
{
cout<<"haha,MidOrderTraversal "<<data<<endl;
} //中序遍历二叉树
void MidOrderTraversal(BitTree T)
{
if(T)
{
MidOrderTraversal(T->lchild);
play(T->data);
MidOrderTraversal(T->rchild);
}
} int main()
{
int level=1;
BitTree T=NULL; CreateBitTree(&T); //We have to pass the reference
PreOrderTraversal(T,level);
MidOrderTraversal(T);
PostOrderTracersalDelete(T); return 0;
}

  

  

Binary Trees的更多相关文章

  1. hdu3240 Counting Binary Trees

    Counting Binary Trees Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  2. [leetcode-617-Merge Two Binary Trees]

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...

  3. Merge Two Binary Trees

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...

  4. [LeetCode] Merge Two Binary Trees 合并二叉树

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...

  5. [Swift]LeetCode617. 合并二叉树 | Merge Two Binary Trees

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...

  6. [Swift]LeetCode823. 带因子的二叉树 | Binary Trees With Factors

    Given an array of unique integers, each integer is strictly greater than 1. We make a binary tree us ...

  7. [Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees

    A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of al ...

  8. [Swift]LeetCode951. 翻转等价二叉树 | Flip Equivalent Binary Trees

    For a binary tree T, we can define a flip operation as follows: choose any node, and swap the left a ...

  9. [LeetCode] Binary Trees With Factors 带因子的二叉树

    Given an array of unique integers, each integer is strictly greater than 1. We make a binary tree us ...

随机推荐

  1. 超赞网页背景效果-canvas-nest.js

    canvas-nest.js 是 canvas 上绘制的蜂窝状网站背景. 引入的时候的注意事项:js加载的时候需要保证body已经加载: 一个简单的demo: <!DOCTYPE html> ...

  2. [ An Ac a Day ^_^ ][kuangbin带你飞]专题六 最小生成树 POJ 2031 Building a Space Station

    最小生成树模板题 注意最后输出用%f (从C99开始%f已经不能用于输出double 即 输入用%lf 输出用%f) #include<cstdio> #include<algori ...

  3. .net: 不能忽视的break——寻找VS2010和VS2012编译器的一个小区别

    文中的问题来自于实际开发,但是实际开发中的代码逻辑比较复杂,因此下面的代码去掉了所有逻辑,只保留能体现问题的代码,类和都只为了说明问题,并不具有实际意义.下面首先看看下面的代码和现象. 1. 问题再现 ...

  4. 命令行解决mysql中文乱码

    修改my.ini文件中的 [mysql] default-character-set=gbk [mysqld] # The default character set that will be use ...

  5. Shell 脚本计算时间差

    在shell脚本中统计程序执行完毕所需要的时间不像在java中使用System.currentTimeMillis()方便 稍微记录一下,以供备用,免得又去花时间想(统计程序执行消耗多少s): sta ...

  6. xml动态修改 dom4j修改

    xml的动态修改需要传入的参数 xml的位置(tomcat中的发布位置).修改后的xml需要保存的位置(因为动态修改,所以建议和xml未修改前的位置相同).添加的节点的信息.或者修改的节点的信息 SA ...

  7. [SOJ] can I post the letter?

    1155. Can I Post the letter Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description I am a t ...

  8. CC版本添加 LUCI

    BB版本的时候,在 feeds/luci/contrib/package/luci下的Makefile文件添加上需要编译的 luci-application即可. 在CC版里改为:Feeds/luci ...

  9. PQ分区魔术师v9.0 中文版

    软件名称: pqmagic 硬盘分区大师9.0中文绿色版 软件大小:5.80MB 软件语言:简体中文 软件类别:磁盘工具 软件授权:免费软件 更新时间:2013-10-082013-10-08 09: ...

  10. 谈谈ThreadStatic

    可能经常做多线程.线程池的童鞋早就知道这种问题,原谅我一直对线程研究不深. 这个东西好像出现有一段时间了,不过最近我才用到,做的API的服务,用来保存当前请求的上下文内容,原来用过Thread.Set ...