卡码网刷题记录22-23

22.遍历二叉树

题目描述

给出一个n个节点的二叉树,请求出二叉树的前序遍历,中序遍历和后序遍历。

输入描述

第一位一个整数n表示左儿子序号,第二个表示右儿子序号,如果该序号为0表示没有。 (例如下面示例中,F序号为1,C序号为2,E序号为3,A序号为4,D序号为5,G序号为6,B序号为7)

输出描述

共三行,第一行为二叉树的前序遍历,第二行为中序遍历,第三行为后序遍历

输入示例

7
F 2 3
C 4 5
E 0 6
A 0 0
D 7 0
G 0 0
B 0 0

输出示例

FCADBEG
ACBDFEG
ABDCGEF

题解(C语言):

#include <stdio.h>
#include <stdlib.h>
// 树结构体
typedef struct TreeNode{
    char val;
    struct TreeNode *left;
    struct TreeNode *right;
}TreeNode;

// 前序遍历
void PreOrder(TreeNode *root){
    if(root == NULL) return;
    printf("%c",root -> val);
    PreOrder(root -> left);
    PreOrder(root -> right);
}

// 中序遍历
void InOrder(TreeNode *root){
    if(root == NULL) return;
    InOrder(root->left);
    printf("%c",root->val);
    InOrder(root->right);
}

// 后序遍历
void PostOrder(TreeNode *root){
    if(root == NULL) return;
    PostOrder(root->left);
    PostOrder(root->right);
    printf("%c",root->val);
}

// 创建树
TreeNode *CreatTree(char elem[],int A[],int B[],int Index){
    if(Index == 0) return NULL;
    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
    root->val = elem[Index-1];
    // 构建左子树
    if(A[Index-1]){
        root->left = CreatTree(elem,A,B,A[Index-1]);
    }
    // 构建右子树
    if(B[Index-1]){
        root -> right = CreatTree(elem,A,B,B[Index-1]);
    }
    return root;
}

int main(){
    int n;
    scanf("%d",&n);
    getchar();
    char elem[n];
    int A[n],B[n],i=0;
    while(scanf("%c",&elem[i]) != EOF){
        scanf("%d %d",&A[i],&B[i]);
        i++;
        getchar();
    }
    TreeNode *root = CreatTree(elem,A,B,1);
    PreOrder(root);
    printf("\n");
    InOrder(root);
    printf("\n");
    PostOrder(root);
    return 0;
}

23.二叉树的高度

题目描述

现给定一棵二叉树的先序遍历序列和中序遍历序列,要求你计算该二叉树的高度。

输入描述

输入包含多组测试数据,每组输入首先给出正整数N(<=50),为树中结点总数。下面2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出描述

对于每组输入,输出一个整数,即该二叉树的高度。

输入示例

9
ABDFGHIEC
FDHGIBEAC
7
Abcdefg
gfedcbA

输出示例

5
7

题解(C语言):

#include <stdio.h>
#include <stdlib.h>
// 树结构体
typedef struct TreeNode{
    char val;
    struct TreeNode *left;
    struct TreeNode *right;
}TreeNode;
// 根据先序遍历和中序遍历创建树
TreeNode *PreInCreate(char PreOrder[], char InOrder[], int l1, int h1, int l2, int h2){
    // l1和h1为左子树中的第一个和最后一个下标
    // l2和h2为右子树中的第一个和最后一个下标
    // 初始时l1=l2=0,h1=h2=n-1
    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
    root -> val = PreOrder[l1];
    int i = 0;
    for(i = l2; InOrder[i] != root -> val; i++);
    int l_len = i - l2; // 左子树长度
    int r_len = h2 - i; // 右子树长度
    if(l_len){
        root -> left = PreInCreate(PreOrder, InOrder, l1+1, l1 + l_len, l2, l2+l_len-1);
    }else root -> left = NULL;
    if(r_len){
        root -> right = PreInCreate(PreOrder, InOrder, h1-r_len+1, h1, h2-r_len+1, h2);
    }else root -> right = NULL;
    return root;
}
// 计算二叉树高度
int GetHeight(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }

    int leftHeight = GetHeight(root->left);
    int rightHeight = GetHeight(root->right);

    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        getchar();
        char PreOrder[n], InOrder[n];
        scanf("%s %s",PreOrder,InOrder);
        getchar();
        TreeNode *root = PreInCreate(PreOrder,InOrder,0,n-1,0,n-1);
        printf("%d\n",GetHeight(root));
    }
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值