赞
踩
对于给定的二叉树,输出其先序序列、中序序列、后序序列并输出叶子结点数。
二叉树的先序遍历序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
若是非空二叉树,则输出四行内容 第一行是二叉树的先序遍历序列; 第二行是二叉树的中序遍历序列; 第三行是二叉树的后序遍历序列; 第四行是叶子结点数;
若是空二叉树 只需输出叶子数0
FCA##DB###EHM###G##
- FCADBEHMG
- ACBDFMHEG
- ABDCMHGEF
- 4
#
0
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
- #include<stdio.h>
- #include<stdlib.h>
- #define MAXSIZE 1000
-
- typedef struct Tree{
- char data;
- struct Tree* lchild;
- struct Tree* rchild;
- }DouTree, *Treelink;
-
- Treelink createTree(char *preorder){
- static int index = 0; // 使用 static 修饰标识符 index 的目的是为了在递归调用过程中保持它的值,从而实现正确的遍历操作。
- //如果不使用 static 关键字修饰 index,则会导致递归调用时每次都创建一个新的变量,并在返回上层时丢失先前的值。
- if(preorder[index] == '#' || preorder[index] == '\0'){ // 如果字符是 '#' 或者字符串终止符 '\0',表示该二叉树是空树
- index++;
- return NULL;
- }
-
- Treelink root = (Treelink)malloc(sizeof(DouTree)); // 创建一个新节点
- root->data = preorder[index++]; // 读取当前字符作为节点数据,并将索引 index 加一,指向下一个字符
- root->lchild = createTree(preorder); // 递归创建左子树
- root->rchild = createTree(preorder); // 递归创建右子树
-
- return root; // 返回根节点
- }
-
- void PreorderTraversal(Treelink root){
- if(root != NULL){
- printf("%c", root->data); // 先输出当前节点的数据
- PreorderTraversal(root->lchild); // 递归先序遍历左子树
- PreorderTraversal(root->rchild); // 递归先序遍历右子树
- }
- }
-
- void InorderTraversal(Treelink root){
- if(root != NULL){
- InorderTraversal(root->lchild); // 递归中序遍历左子树
- printf("%c", root->data); // 输出当前节点的数据
- InorderTraversal(root->rchild); // 递归中序遍历右子树
- }
- }
-
- void PostorderTraversal(Treelink root){
- if(root != NULL){
- PostorderTraversal(root->lchild); // 递归后序遍历左子树
- PostorderTraversal(root->rchild); // 递归后序遍历右子树
- printf("%c", root->data); // 输出当前节点的数据
- }
- }
-
- int countTreeleft(Treelink root){
- if(root == NULL) return 0; // 空树没有叶子节点
- else if (root->lchild == NULL && root->rchild == NULL) return 1; // 只有一个节点的树,即根节点,是叶子节点
- else return countTreeleft(root->lchild) + countTreeleft(root->rchild); // 递归计算左右子树的叶子节点数,并求和
- }
-
- int main(){
- char preorder[MAXSIZE];
- scanf("%s", preorder);
- Treelink root = createTree(preorder); // 根据先序遍历序列创建二叉树结构
-
- if(countTreeleft(root) != 0){ // 如果不是空树
- PreorderTraversal(root); // 先序遍历并输出结果
- printf("\n");
-
- InorderTraversal(root); // 中序遍历并输出结果
- printf("\n");
-
- PostorderTraversal(root); // 后序遍历并输出结果
- printf("\n");
- }
-
- printf("%d", countTreeleft(root)); // 输出叶子节点数
- free(root); // 释放树的内存
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。