二叉树基本操作集(创建、递归遍历、深度等)
2016-11-30 23:46
507 查看
为了防止有的小伙伴混淆,在看代码之前我先说明一下,CreateBinTree函数只是我个人比较喜欢的创建一个简单二叉树的方法,当然此外还有很多其他方法创建二叉树,在此不表。因为是递归调用,所以在开始使用这个函数创建的时候,最好直接输入一个字符串,当然你愿意一个一个输入字符也可以;不过这个字符串必须是先序序列,没有孩子的地方以’#’代替,一个空二叉树就是’#’,只有根节点的二叉树就是’a##’,’a’为根节点的值。
先输入一个三层满二叉树
124##5##36##7##
输出
PreOrder: 1 2 4 5 3 6 7
InOrder: 4 2 5 1 6 3 7
PostOrder: 4 5 2 6 7 3 1
第1层:1
第2层:2 3
第3层:4 5 6 7
叶子节点数为4
值为’4’的节点深度为3
再输入一个三层非满的完全二叉树
abd##e##c##
输出
PreOrder: a b d e c
InOrder: d b e a c
PostOrder: d e b c a
第1层:a
第2层:b c
第3层:d e
叶子节点数为3
值为’4’的节点深度为0
最后输入一个最普通的四层二叉树
abd##e#g##cf###
输出
PreOrder: a b d e g d f
InOrder: d b e g a f d
PostOrder: d g e b f d a
第1层:a
第2层:b d
第3层:d e f
第4层:g
叶子节点数为3
值为’4’的节点深度为0
自己反复测试了一下这个代码,完全运行正常。如果有小伙伴发现程序有漏洞或者逻辑错误,欢迎在评论里指正
#include<stdio.h> #include<stdlib.h> //暂定数据类型为字符型char typedef char ElemType; //存储结构 typedef struct BinNode{ ElemType Data; struct BinNode *Left, *Right; }*BinTree; //创建二叉树 BinTree CreateBinTree(); //先序递归遍历 void PreOrderTraversal( BinTree T ); //中序递归遍历 void InOrderTraversal( BinTree T ); //后序递归遍历 void PostOrderTraversal( BinTree T ); //计算树的深度(高度) int Depth(BinTree T); //打印某层节点 void PrintNodeAtLevel(BinTree T, int level); //层次递归遍历 void LevelOrderTraversal(BinTree T); //计算叶子节点数目 int LeafNodeCount(BinTree T); //计算值为Data的节点的深度 int NodeDepth(BinTree T,ElemType Data); //主函数 //------------------------------------------------------------------------------------------------------------------------------------------ int main() { BinTree T = CreateBinTree(); printf("PreOrder: "); PreOrderTraversal(T); printf("\n"); printf("InOrder: "); InOrderTraversal(T); printf("\n"); printf("PostOrder: "); PostOrderTraversal(T); printf("\n"); LevelOrderTraversal(T); printf("叶子节点数为%d\n",LeafNodeCount(T)); //深度为0代表没找到 printf("值为'4'的节点深度为%d\n",NodeDepth(T,'4')); } //------------------------------------------------------------------------------------------------------------------------------------------ //创建二叉树 /*构造时候,在先序排列里每个叶子节点后加入两个'#',只有一个孩子的分支节点在空位上补#,将此字符串输入,此处是按照先序设计的CreateBinTree函数, 即输入'124##5##36##7##'就是一个3层的满二叉树,如果想改造成中序或者后序设计,仿照递归遍历设计即可*/ BinTree CreateBinTree() { ElemType ch; scanf("%c",&ch); BinTree T; if(ch=='#') T = NULL; else { T = (BinTree)malloc(sizeof(struct BinNode)); if(!T) { printf("Error!"); return NULL; } T->Data = ch;//这句也可以放在Left或者Right后面 T->Left = CreateBinTree(); T->Right = CreateBinTree(); } return T; } //先序递归遍历 void PreOrderTraversal( BinTree T ) { if( T ) { printf("%c ", T->Data ); PreOrderTraversal( T->Left ); PreOrderTraversal( T->Right ); } } //中序递归遍历 void InOrderTraversal( BinTree T ) { if( T ) { InOrderTraversal( T->Left ); printf("%c ", T->Data); InOrderTraversal( T->Right ); } } //后序递归遍历 void PostOrderTraversal( BinTree T ) { if( T ) { PostOrderTraversal( T->Left ); PostOrderTraversal( T->Right ); printf("%c ", T->Data); } } //递归法求二叉树高度 int Depth(BinTree T) { int HL, HR, MaxH; if(T) { HL = Depth(T->Left); HR = Depth(T->Right); MaxH = (HL > HR) ? HL : HR; return MaxH + 1; } else return 0; } //打印某层的节点 void PrintNodeAtLevel(BinTree T, int level) { //空树或者层次不合理 if(T==NULL || level < 1) return; if(level == 1) { printf("%c ",T->Data); return; } //左子树的level-1级 PrintNodeAtLevel(T->Left,level - 1); //右子树的level-1级 PrintNodeAtLevel(T->Right,level - 1); } //层次递归遍历 void LevelOrderTraversal(BinTree T) { if(T==NULL) return; int depth = Depth(T); int i; for(i = 1;i <= depth;i++) { printf("第%d层:",i); PrintNodeAtLevel(T,i); printf("\n"); } } //计算叶子节点数目 int LeafNodeCount(BinTree T) { if(T==NULL) return 0; else if(T->Left==NULL && T->Right==NULL) return 1; else return LeafNodeCount(T->Left) + LeafNodeCount(T->Right); } //计算值为Data某节点的深度 int NodeDepth(BinTree T,ElemType Data) { if(T==NULL) return 0; else if(T->Data==Data) return 1; else if(T->Left==NULL && T->Right==NULL) return 0; else { int L = NodeDepth(T->Left,Data); int R = NodeDepth(T->Right,Data); if(L) return L+1; else if(R) return R+1; else return 0; } }
先输入一个三层满二叉树
124##5##36##7##
输出
PreOrder: 1 2 4 5 3 6 7
InOrder: 4 2 5 1 6 3 7
PostOrder: 4 5 2 6 7 3 1
第1层:1
第2层:2 3
第3层:4 5 6 7
叶子节点数为4
值为’4’的节点深度为3
再输入一个三层非满的完全二叉树
abd##e##c##
输出
PreOrder: a b d e c
InOrder: d b e a c
PostOrder: d e b c a
第1层:a
第2层:b c
第3层:d e
叶子节点数为3
值为’4’的节点深度为0
最后输入一个最普通的四层二叉树
abd##e#g##cf###
输出
PreOrder: a b d e g d f
InOrder: d b e g a f d
PostOrder: d g e b f d a
第1层:a
第2层:b d
第3层:d e f
第4层:g
叶子节点数为3
值为’4’的节点深度为0
自己反复测试了一下这个代码,完全运行正常。如果有小伙伴发现程序有漏洞或者逻辑错误,欢迎在评论里指正
相关文章推荐
- 二叉树的基本操作(创建、递归和非递归遍历、求深度、求叶子数)
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 二叉树与其基本递归操作:创建、遍历、特征量计算等
- 数据结构(二叉树系列)先序创建三种遍历和求深度(递归实现)
- 二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度
- 二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 二叉树创建、遍历(递归和非递归)、深度及求取二叉树中和为某一值的所有路径
- 二叉树的创建,遍历,查找,查找父节点,深度,大小等的递归实现
- C二叉树的基本操作---创建、遍历、求深度、求叶子结点
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- C++递归创建、非递归遍历二叉树的基本操作
- 二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度
- 二叉树的基本操作精集(创建、遍历、求深度结点以及叶子结点个数)
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 递归方法实现二叉树的创建,遍历
- 二叉树创建及遍历(递归遍历)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)
- 二叉树创建及遍历算法(递归及非递归)[整理]