二叉树总结
来源:互联网 发布:mac luajit 安装 编辑:程序博客网 时间:2024/06/15 16:31
二叉树总结就由引入该图开始。
一般来说,关于二叉树算法都是由定义的结构体开始的。
结构体定义分为三个结构,一个数据域,一个左孩子指针和一个右孩子指针,借助于结构体,就可以对二叉树进行各种操作。
————————————————————————————————————————————————————————
首先,根据这个二叉树,我们可以知道根节点A,将其地址设为根节点T。那么,T的类型就可以写为:BiNode *T或BiTree T。根节点的数据即T->data。左孩子节点B的数据即T-lchild,节点C的数据是T->lchile->lchile。
————————————————————————————————————————————————————————
二叉树的建立:
①先序遍历建立二叉树
建立二叉树,我们可以想到一棵树,我们只有从根部开始,沿着根部找啊找,找到其他子树。
所以二叉树也是如此,我们找到根节点T,从根节点开始往下找这棵树的左右子树。
由这个思路,我们即想到了递归算法。
例如:现在我们已经知道图示的二叉树,按先序序列读入字符的顺序为:ABC@@DE@G@@F@@@(@表示空树)
递归体: 要注意,最后要返回根节点。
②根据先(后)序和中序建立二叉树
现以 先序序列:abdegcf
中序序列:dbgeafc为例,建立二叉树。
我们根据先序和中序来确定一个二叉树,不用代码写,你可以简单的画出这个二叉树,但是现在我们要用编程的思维来画出这个二叉树,我们需要做的就是理解怎么来建这个二叉树,要根据先序、中序确定这棵二叉树的根、左子树、右子树。还要知道左子树和右子树的位置和个数。
同样的如上,我们想到的就是利用递归做,用数组把先序和中序序列存起来。
先序序列pre[] 中序序列in[]先序起始下标pp 中序起始下标ip个数n
图中有几处省略,sizeof(BiTNode)、creat(pre,in,pp+1,ip,i)。
for循环的作用就是利用前序与中序比较是否相等,如果相等则i++,i最后的值就代表了子树的个数。
————————————————————————————————————————————————————————
二叉树的遍历: 非线性->线性
①前序遍历:根、左、右
若以上图二叉树为例,则该二叉树的前序序列即ABCDEGF
void PreOrderTraverse(BiTree T){
if(T){
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
②中序序列:左、根、右
若以上图二叉树为例,则该二叉树的中序序列即CBEGDFA
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
③后序序列:左、右、根
若以上图二叉树为例,则该二叉树的后序序列即CGEFDBA
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
④层次遍历:从上到下,从左到右
void postorder(BiTree T){
int rear=1,front=0;
BiTree p[51];
p[0]=T;
while(rear>front){
if(p[front]){
printf("%c",p[front]->data);
p[rear++]=p[front]->lchild;
p[rear++]=p[front]->rchild;
front++;
}
else
front++;
}
}
利用数组模拟队列(先进先出)。
————————————————————————————————————————————————————————
二叉树的深度:
如果是空树,递归结束,深度为0,否则:递归计算左子树的深度记为m;递归计算右子树的深度记为n;如果m大于n,二叉树深度为m+1,否则为n+1。
int Depth(BiTree T){
int n,m;
if(T==NULL)
return 0;
else{
m=Depth(T->lchild);
n=Depth(T->rchild);
if(m>n)
return (m+1);
else
return (n+1);
}
}
————————————————————————————————————————————————————————
二叉树叶子节点数目的统计: count初始值为0
void leaves(BiTree T)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
{
count++;
}
leaves(T->lchild);
leaves(T->rchild);
}
}
————————————————————————————————————————————————————————
- 二叉树<总结一>
- 二叉树<总结二>
- 二叉树的总结
- 二叉树算法总结
- 二叉树总结
- 二叉树题总结
- 二叉树学习总结
- 二叉树<总结一>
- 二叉树<总结二>
- 二叉树总结
- 二叉树性质总结
- 二叉树的总结
- 二叉树应用总结
- 数据结构---二叉树总结
- 二叉树总结
- 二叉树总结_legend
- 二叉树题目总结
- 二叉树总结
- redis作为分布式锁的要点
- 错误总结-apache-CXF
- java开发系统内核:实现窗口创建API,由DOS进入windows
- listview点击实现帧动画平移放大
- Linux下如何查看版本信息
- 二叉树总结
- Node.js环境变量配置
- mac 启用wifi调试android 程序
- 查找不到根节点的不可见的物体,transform.Find 与GameObject.Find区别
- Java基础
- AtCoder Regular Contest 080 E
- Java对象引用
- Java封装
- Palindrome Linked List