针对考研的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;
}

代码运行结果

相关推荐
星火开发设计7 分钟前
C++ 函数定义与调用:程序模块化的第一步
java·开发语言·c++·学习·函数·知识
嗯嗯=20 分钟前
STM32单片机学习篇3
stm32·单片机·学习
43v3rY0unG21 分钟前
哈希表学习
学习·哈希算法·散列表
AI_零食1 小时前
鸿蒙跨端框架 Flutter 学习 Day 6:异步编程:等待的艺术
学习·flutter·华为·交互·harmonyos·鸿蒙
梁洪飞1 小时前
通过链接文件和Start.S学习armv7
linux·arm开发·嵌入式硬件·学习·arm
小赵还有头发2 小时前
安装Ceres与glog
linux·学习·无人机·ceres·glog
Engineer邓祥浩2 小时前
设计模式学习(16) 23-14 命令模式
学习·设计模式·命令模式
zhangrelay2 小时前
ROS云课三分钟-cmake默认版本和升级-260120
笔记·学习
sycmancia3 小时前
C语言学习07——变量的作用域
c语言·学习
海上Bruce3 小时前
C primer plus (第六版)第十二章 编程练习第1题
c语言