二叉树的基本操作精集(创建、遍历、求深度结点以及叶子结点个数)
来源:互联网 发布:淘宝允许好评返现吗 编辑:程序博客网 时间:2024/05/09 17:02
对于二叉树的操作一般的我们使用递归的方法,因为在二叉树中每一个子树又是一颗二叉树。
这篇代码主要是演示了二叉树的以下操作
- 二叉树的创建
- 二叉树的三种遍历
- 求解二叉树的高度
- 求解指定层数的结点个数
- 求解二叉树的叶子结点个数
/*********************************************************- Copyright (C): 2016- File name : tree.c- Author : - Zhaoxinan -- Date : 2016年07月31日 星期日 19时44分36秒- Description : * *******************************************************/#include <stdio.h>#include <stdlib.h>//定义结点typedef struct BiTNode{ char data; //数据 struct BiTNode *lchild; //左孩子 struct BiTNode *rchild; //右孩子}BiTNode, *BiTree;////////////////////////////////////////////////////////////先序创建二叉树BiTree CreateBiTree(){ char ch; BiTree T; scanf("%c", &ch); if (ch == '#') { T = NULL; } else { T = (BiTree)malloc(sizeof(BiTNode)); T->data = ch; T->lchild = CreateBiTree(); T->rchild = CreateBiTree(); } return T;}////////////////////////////////////////////////////////////先序遍历而叉树void PreOrderTraverse(BiTree T){ if (T) { printf("%c", T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); }}////////////////////////////////////////////////////////////中序遍历二叉树void InOrderTraverse(BiTree T){ if (T) { InOrderTraverse(T->lchild); printf("%c",T->data); InOrderTraverse(T->rchild); }}////////////////////////////////////////////////////////////后序遍历二叉树void PostOrderTraverse(BiTree T){ if (T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c", T->data); }}/*//////////////////////////////////////////////////////// 求二叉树中的节点个数 递归解法: 1、如果二叉树为空,节点个数为0 2、如果二叉树不为空,二叉树节点个数 = 左子树节点个数+右子树节点个数+1*/////////////////////////////////////////////////////////int GetNodeNum(BiTree T){ if (T == NULL) { return 0; } return GetNodeNum(T->lchild)+GetNodeNum(T->rchild)+1;}/*/////////////////////////////////////////////////////// 求二叉树的深度 递归解法: 1、如果二叉树为空,二叉树的深度为0 2、如果二叉树不为空,二叉树的深度= max(左子树深度+右子树深度)+1 *//////////////////////////////////////////////////////int GetTreeDepth(BiTree T){ if (T == NULL) { return 0; } int LDepth = GetTreeDepth(T->lchild); int RDepth = GetTreeDepth(T->rchild); return LDepth > RDepth ? (LDepth + 1) : (RDepth + 1);}/*/////////////////////////////////////////////////////// 求二叉树第K层的节点个数 1、如果二叉树为空或着k<1 返回0 2、如果二叉树不为空并且K == 1,返回1 3、如果二叉树不为空并且K>1,返回左子树中K-1层的节点个数与右子树k-1层节点个数之和 *//////////////////////////////////////////////////////int GetNodeNumKthLevel(BiTree T, int k){ if (T == NULL || k < 1) { return 0; } if (k == 1) { return 1; } int numleft = GetNodeNumKthLevel(T->lchild, k-1); int numright = GetNodeNumKthLevel(T->rchild, k-1); return (numleft + numright);}/*/////////////////////////////////////////////////////// 求二叉树中叶子节点的个数 1、如果二叉树为空,返回0 2、如果二叉树不为空且左右子树为空,返回1 3、如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数 *///////////////////////////////////////////////////////int GetLeafNodeNum(BiTree T){ if (T == NULL) { return 0; } if (T->lchild == NULL && T->rchild == NULL) { return 1; } int numleft = GetLeafNodeNum(T->lchild); int numright = GetLeafNodeNum(T->rchild); return (numleft + numright);}//////////////////////////////////////////////////////////int main(){ int TreeLevel; //二叉树的层数 int TreeLeafNum = 0; //二叉树的叶子节点个数 int TreeKlevelNum = 0; //二叉树第K层的节点个数 int TreeDepth = 0; //二叉树的深度 int TreeNodeNum = 0; //二叉树结点个数 BiTree T; T = CreateBiTree(); //创建二叉树 printf("\n----------前序遍历---------\n"); PreOrderTraverse(T); printf("\n----------中序遍历---------\n"); InOrderTraverse(T); printf("\n----------后序遍历---------\n"); PostOrderTraverse(T); printf("\n----------节点个数---------\n"); TreeNodeNum = GetNodeNum(T); printf("%d\n", TreeNodeNum); printf("\n----------树的深度---------\n"); TreeDepth = GetTreeDepth(T); printf("%d\n", TreeDepth); printf("\n---------树的叶子节点-------\n"); TreeLeafNum = GetLeafNodeNum(T); printf("%d\n", TreeLeafNum); printf("\n请输入树的层数,将会得到该层节点数\n"); scanf("%d", &TreeLevel); TreeKlevelNum = GetNodeNumKthLevel(T, TreeLevel); printf("\n---------%d层节点数--------\n", TreeLevel); printf("%d\n", TreeKlevelNum); return 0;}
对应以上代码,我们将#代替空结点
例如:我们输入AB##CD##EF###代表如下树
代码测试结果如下
0 0
- 二叉树的基本操作精集(创建、遍历、求深度结点以及叶子结点个数)
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- C二叉树的基本操作---创建、遍历、求深度、求叶子结点
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 二叉树的操作:创建、遍历、求树的深度、叶子结点数
- 求二叉树的叶子结点个数及深度
- 二叉树的一些基本操作(括号表示法,宽度,深度,结点个数,叶子节点个数)
- 二叉树 (求叶子结点&深度)
- 二叉树(求深度、叶子结点)
- 二叉树先序后序递归建立,前中后序层次非递归遍历,以及统计叶子结点个数以及树的深度
- 二叉树的创建以及四种遍历,叶子结点的数量,二叉树深度(简单二叉树)
- 二叉树创建、遍历、叶结点个数及深度的操作实现
- 7-1 求二叉树的叶子结点个数
- 求二叉树的深度、宽度和叶子结点数
- 二叉树的基本操作(创建、递归和非递归遍历、求深度、求叶子数)
- 求树的叶子结点的个数
- C语言二叉树创建、遍历以及统计结点、叶子结点
- 数据结构--二叉树的创建、先序遍历、中序遍历、后序遍历、深度、叶子结点数
- ASP.NET MVC4整合NHibernate,FluentNHibernate,MySQL数据库的应用
- 收藏:更换手机号必做的9件事
- sqlite
- Docker: Create Image from Container
- 毕业之后的第一份工作
- 二叉树的基本操作精集(创建、遍历、求深度结点以及叶子结点个数)
- 个人技术反思
- android开发常用的4种设计模式思想
- Exponential notation
- Android L(SDK 5.0)新特性
- 多线程抽象编程模型(Python版)
- apache 虚拟主机 的一些配置
- 二叉查找树转双向链表JAVA实现
- 剑指offer第28题:字符串的排列