【数据结构】输入二叉树的前序序列,输出二叉树的不同度的结点个数

#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int  Status;//定义Status是int类型
typedef char  ElemType;//定义ElemType是char类型
int a=0,b=0,c=0;//定义全局变量a,b,c统计不同度数的结点数

typedef struct BiTNode//定义二叉树
{
  ElemType data;//储存数据
  struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;

Status CreateBiTree(BiTree &T) // 构造二叉链表表示的二叉树T。
{
  // 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
  char ch;
  scanf("%c",&ch);
  if (ch=='#')
  T = NULL;//如果输入的第一个字符就是#,证明这是一颗空树
  else
  {
    if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
    return ERROR;//没有申请到内存空间返回ERROR
    else//申请到了内存空间
    {
        T->data=ch; // 生成根结点
     CreateBiTree(T->lchild);  // 递归构造左子树
     CreateBiTree(T->rchild);  // 递归构造右子树
    }

  }
  return OK;
}


void A(BiTree T)
{
    if(T)
    {
        if(T->rchild!=NULL&&T->lchild!=NULL)
            a++;//如果左右孩子指针都不为空则确定了该结点度数为2
        if(T->rchild)
        A(T->rchild);
        if(T->lchild)
        A(T->lchild);
    }
}

void B(BiTree T)
{
    if(T)
    {
        if((T->rchild==NULL&&T->lchild!=NULL)||(T->rchild!=NULL&&T->lchild==NULL))
        b++;//只有一个孩子指针不为空则该结点的度数为1
        if(T->rchild)
        B(T->rchild);
        if(T->lchild)
        B(T->lchild);
    }
}

void C(BiTree T)
{
    if(T)
    {
        if(T->rchild==NULL&&T->lchild==NULL)
        c++;
        if(T->rchild)
        C(T->rchild);
        if(T->lchild)
        C(T->lchild);
    }
}


int main()
{
    BiTree T;
    CreateBiTree(T);
    A(T);//统计度数为2的结点数
    B(T);//统计度数为1的结点数
    C(T);//统计度数为0的结点数,即叶子结点数
    printf("%d\n%d\n%d\n",a,b,c);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个实现的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 二叉树结点结构 typedef struct Node { char data; struct Node* left; struct Node* right; } Node; // 创建新结点 Node* createNode(char data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 根据前序序列和中序序列构造二叉树 Node* buildTree(char* preorder, char* inorder, int start, int end) { static int preIndex = 0; // 前序序列遍历完或起始位置大于结束位置,返回空指针 if (start > end) return NULL; // 创建当前结点,并将前序序列的下一个元素作为当前结点 Node* newNode = createNode(preorder[preIndex++]); // 在中序序列中找到当前结点的位置 int inIndex; for (int i = start; i <= end; i++) { if (inorder[i] == newNode->data) { inIndex = i; break; } } // 递归构造左子树和右子树 newNode->left = buildTree(preorder, inorder, start, inIndex - 1); newNode->right = buildTree(preorder, inorder, inIndex + 1, end); return newNode; } // 后序遍历二叉树 void postorderTraversal(Node* root) { if (root == NULL) return; // 后序遍历左子树 postorderTraversal(root->left); // 后序遍历右子树 postorderTraversal(root->right); // 输出当前结点的数据 printf("%c ", root->data); } // 查找为1的结点 void findNodesWithDegreeOne(Node* root) { if (root == NULL) return; // 当前结点只有一个子结点 if ((root->left == NULL && root->right != NULL) || (root->left != NULL && root->right == NULL)) printf("%c ", root->data); // 递归查找左子树和右子树中的为1的结点 findNodesWithDegreeOne(root->left); findNodesWithDegreeOne(root->right); } int main() { char preorder[] = {'A', 'B', 'D', 'E', 'C', 'F'}; char inorder[] = {'D', 'B', 'E', 'A', 'F', 'C'}; Node* root = buildTree(preorder, inorder, 0, sizeof(preorder) / sizeof(preorder[0]) - 1); printf("后序序列:"); postorderTraversal(root); printf("\n"); printf("为1的结点:"); findNodesWithDegreeOne(root); printf("\n"); return 0; } ``` 这段代码实现了根据输入前序序列和中序序列构造一棵二叉树,并输出后序序列和所有为1的结点。你可以根据需要修改前序序列和中序序列的内容来构造不同二叉树

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值