二叉树的建立及遍历(递归)
2018-01-31 15:29
155 查看
二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
二叉树特点:
1)每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。
2)左子树和右子树是有顺序的,次序不能颠倒。
3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。
二叉树具有五种基本形态:
1)空二叉树;
2)只有一个根结点;
3)根结点只有左子树;
4)根结点只有右子树;
5)根结点既有左子树又有右子树。
特殊的二叉树:
1)斜树:所有的结点都只有左子树的二叉树叫左斜树。所有的结点都是只有右子树的二叉树叫右斜树。这二者统称为斜树。斜树有明显特点,每一层都只有一个结点,结点的个数和二叉树的深度相同。斜树和线性表结构一样,线性表结构是树的一种特殊表现形式。
2)满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。单是每个节点都存在左右子树,不能算是满n二叉树,还必须要所有的叶子结点都在同一层上,这样就做到了整棵树的平衡。所以,满二叉树的特点是:1.叶子只能出现在最下一层,出现在其他层就不能达到平衡;2.非叶子结点的度一定是2;3.在同样深度的二叉树中,满二叉树的结点最多,叶子数最多。
3)完全二叉树:对一棵具有n个结点的二叉树 按层序编号 ,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树。
完全二叉树的特性:
1)叶子结点只能出现在最下两层。
2)最下层的叶子一定集中在左部连续位置。
3)倒数第二层,若有叶子结点,一定都在右部连续位置。
4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。
5)同样结点数的二叉树,完全二叉树的深度最小。
二叉树的性质:
性质一:在二叉树的第i层上至多有 2i−1 个结点(i≥1)
性质二:深度为k的二叉树至多有 2k−1 个结点(k≥1)
性质三:对任何一棵二叉树T,如果其终端结点数为 n0,度为2的结点数为 n2,则 n0=n2+1
性质四:具有n个结点的完全二叉树的深度为 |log2n|+1(其中|x|表示不大于x的最大整数)
性质五:如果对一棵有n个结点的完全二叉树(深度为 |log2n|+1)的结点按层序编号(从第1层到第|log2n|+1层,每层从左到右),对任一结点i(1≤i≤n)有:
1)如果 i=1,则结点i是二叉树的根,无双亲;如果 i>1,则其双亲是结点|i/2|。
2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i。
3)如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。
以下是全部实现代码:
在VC++6.0中测试结果:
输入:AB#D##CE###
输出:先序遍历的二叉树结果是:ABDCE
中序遍历的二叉树结果是:BDAEC
后序遍历的二叉树结果是:DBECA
二叉树特点:
1)每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。
2)左子树和右子树是有顺序的,次序不能颠倒。
3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。
二叉树具有五种基本形态:
1)空二叉树;
2)只有一个根结点;
3)根结点只有左子树;
4)根结点只有右子树;
5)根结点既有左子树又有右子树。
特殊的二叉树:
1)斜树:所有的结点都只有左子树的二叉树叫左斜树。所有的结点都是只有右子树的二叉树叫右斜树。这二者统称为斜树。斜树有明显特点,每一层都只有一个结点,结点的个数和二叉树的深度相同。斜树和线性表结构一样,线性表结构是树的一种特殊表现形式。
2)满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。单是每个节点都存在左右子树,不能算是满n二叉树,还必须要所有的叶子结点都在同一层上,这样就做到了整棵树的平衡。所以,满二叉树的特点是:1.叶子只能出现在最下一层,出现在其他层就不能达到平衡;2.非叶子结点的度一定是2;3.在同样深度的二叉树中,满二叉树的结点最多,叶子数最多。
3)完全二叉树:对一棵具有n个结点的二叉树 按层序编号 ,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树。
完全二叉树的特性:
1)叶子结点只能出现在最下两层。
2)最下层的叶子一定集中在左部连续位置。
3)倒数第二层,若有叶子结点,一定都在右部连续位置。
4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。
5)同样结点数的二叉树,完全二叉树的深度最小。
二叉树的性质:
性质一:在二叉树的第i层上至多有 2i−1 个结点(i≥1)
性质二:深度为k的二叉树至多有 2k−1 个结点(k≥1)
性质三:对任何一棵二叉树T,如果其终端结点数为 n0,度为2的结点数为 n2,则 n0=n2+1
性质四:具有n个结点的完全二叉树的深度为 |log2n|+1(其中|x|表示不大于x的最大整数)
性质五:如果对一棵有n个结点的完全二叉树(深度为 |log2n|+1)的结点按层序编号(从第1层到第|log2n|+1层,每层从左到右),对任一结点i(1≤i≤n)有:
1)如果 i=1,则结点i是二叉树的根,无双亲;如果 i>1,则其双亲是结点|i/2|。
2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i。
3)如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1。
以下是全部实现代码:
#include<iostream> #define OVERFLOW -2 typedef char ElemType; //二叉树的二叉链表结点结构定义 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //按前序输入二叉树中结点的值,#表示空树,构造二叉链表表示二叉树T void CreateBiTree(BiTree *T) { ElemType ch; scanf("%c",&ch); if(ch=='#') *T=NULL; else { *T=(BiTree)malloc(sizeof(BiTNode)); if(!*T) exit(OVERFLOW); (*T)->data=ch; //生成根节点 CreateBiTree(&(*T)->lchild); //构造左子树 CreateBiTree(&(*T)->rchild); //构造右子树 } } //二叉树的前序遍历递归算法 void PreOrderTraverse(BiTree T) { if(T==NULL) return; printf("%c",T->data); //显示结点数据 PreOrderTraverse(T->lchild);//再先序遍历左子树 PreOrderTraverse(T->rchild);//最后先序遍历右子树 } //二叉树的中序遍历递归算法 void InOrderTraverse(BiTree T) { if(T==NULL) return; InOrderTraverse(T->lchild); //中序遍历左子树 printf("%c",T->data); //显示结点数据 InOrderTraverse(T->rchild); //最后中序遍历右子树 } //二叉树的后序遍历递归算法 void PostOrderTraverse(BiTree T) { if(T==NULL) return; PostOrderTraverse(T->lchild); //先后序遍历左子树 PostOrderTraverse(T->rchild); //再后序遍历右子树 printf("%c",T->data); //显示结点数据 } void main() { BiTree T=NULL; printf("按前序输入二叉树中结点的值,#表示空树:\n"); CreateBiTree(&T); printf("先序遍历二叉树结果是:"); PreOrderTraverse(T); printf("\n"); printf("中序遍历二叉树结果是:"); InOrderTraverse(T); printf("\n"); printf("后序遍历二叉树结果是:"); PostOrderTraverse(T); printf("\n"); }
在VC++6.0中测试结果:
输入:AB#D##CE###
输出:先序遍历的二叉树结果是:ABDCE
中序遍历的二叉树结果是:BDAEC
后序遍历的二叉树结果是:DBECA
相关文章推荐
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- 数据结构_二叉树的先序建立与先序,中序,后序(递归)遍历方式_C语言源代码
- 二叉树的先序建立与非递归遍历C++版
- 二叉树建立以及递归、非递归遍历
- 二叉树的建立(根据遍历结果构建)、遍历(非递归)和搜索
- 二叉树的建立,前中后序遍历的递归版本和非递归版本,层序遍历
- (1)建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。 (3)写出对用二叉链表存储的二叉树进行层次遍历算法。 (4)求二叉树的所有叶子及结点总数。
- 二叉树的建立与递归遍历C++版
- 二叉树非递归先序建立与后序遍历
- 二叉树先序建立,先序遍历,中序遍历,后序遍历(递归)
- 【非递归】二叉树的建立及遍历
- 数据结构之二叉树的递归建立和遍历
- 二叉树建立与遍历递归操作c++实现
- 递归建立和遍历二叉树等
- 二叉树的建立和遍历(递归、非递归)
- 二叉树的建立、遍历、添加、销毁(...递归)
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
- C++实现二叉树的建立和三种递归遍历
- C 二叉树的建立,遍历(递归,非递归)