二叉树的基本操作精集(创建、遍历、求深度结点以及叶子结点个数)

来源:互联网 发布:淘宝允许好评返现吗 编辑:程序博客网 时间: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