针对考研的C语言学习(2014二叉树大题代码实战)

题目描述

解析

1.递归思想遍历节点,若是叶子结点就累加计算的wpl,反之继续遍历

2.代码如下

//树
typedef struct trees {
    ElemType data;
    struct trees* lc;
    struct trees* rc;
}treeNode, * Tree;

3.算法设计

//deep路径长度也叫做深度,0开始
void getWPL(Tree& t, int deep,int &sum)
{
    //判断左子树
    if (t->lc)
    {
        getWPL(t->lc, deep + 1, sum);
    }
    if (t->rc)
    {
        getWPL(t->rc, deep + 1, sum);
    }
    if (!t->lc && !t->rc)
    {
        //叶子结点
        sum += deep * t->data;
        return;
    }
}

【注】递归一定要有终止条件,否则会死循环。

可运行代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;

//树
typedef struct trees {
    ElemType data;
    struct trees* lc;
    struct trees* rc;
}treeNode, * Tree;

//链表
typedef struct Links {
    Tree tree;
    struct Links* next;
}LNode, * LinkList;

//队列
typedef struct {
    LinkList front;
    LinkList rear;
}LinkQue;

void init_que(LinkQue& q)
{
    q.front = q.rear = (LinkList)calloc(1, sizeof(LNode));
    q.front = q.rear;
}

bool isEmpty(LinkQue& q)
{
    return q.front == q.rear;
}

//入队
void push_que(LinkQue& q, Tree tree)
{
    //新建链表节点
    LinkList newList = (LinkList)calloc(1, sizeof(LNode));
    newList->next = NULL;
    newList->tree = tree;
    q.rear->next = newList;
    q.rear = q.rear->next;
}
bool pop_que(LinkQue& q, Tree& tree)
{
    if (isEmpty(q))
    {
        return false;
    }
    LinkList del = q.front->next;//头结点不存数据,第一个节点才是真的数据起始位置
    q.front->next = del->next;//断链
    tree = del->tree;
    if (q.rear == del)//只剩下尾节点的数据
    {
        q.rear = q.front;//置空
    }
    free(del);
    return true;
}

void build_tree(Tree& tree)
{
    LinkQue q;
    init_que(q);
    LinkList cur = NULL;
    ElemType data;
    while (scanf("%c", &data) && data != '\n')
    {
        Tree newTree = (Tree)calloc(1, sizeof(treeNode));//申请新的树的节点
        newTree->data = data;
        if (tree == NULL)
        {
            tree = newTree;
            push_que(q, tree);//入队
            cur = q.rear;
        }
        else
        {
            if (cur->tree->lc == NULL)
            {
                cur->tree->lc = newTree;
                push_que(q, newTree);
            }
            else
            {
                cur->tree->rc = newTree;
                push_que(q, newTree);
                //改变当前父亲节点
                cur = cur->next;
            }
        }
    }
}


void getWPL(Tree& t, int deep,int &sum)
{
    //判断左子树
    if (t->lc)
    {
        getWPL(t->lc, deep + 1, sum);
    }
    if (t->rc)
    {
        getWPL(t->rc, deep + 1, sum);
    }
    if (!t->lc && !t->rc)
    {
        //叶子结点
        sum += deep * t->data;
        return;
    }
}

int main()
{
    Tree tree = NULL;
    build_tree(tree);
    int sum = 0;
    getWPL(tree, 0, sum);
    printf("%d\n", sum);
    return 0;
}

代码运行结果

相关推荐
荒古前19 分钟前
龟兔赛跑 PTA
c语言·算法
嵌入式科普1 小时前
十三、从0开始卷出一个新项目之瑞萨RZN2L串口DMA接收不定长
c语言·stm32·瑞萨·e2studio·rzn2l
biter00881 小时前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
Code哈哈笑2 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
小林熬夜学编程2 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Jackey_Song_Odd3 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
QQ同步助手3 小时前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度
流浪的小新3 小时前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
A懿轩A4 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香4 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法