二叉树用二叉链存储,链接时用叶子结点的rchild 域存放指针。请设计一个算法完成①对一棵二叉树加线索(中序);②把二叉树的叶子结点按从左到右的顺序连成一个单链表。③统计二叉树中0到2度结点个数。
1条回答 默认 最新
- bingbingyihao 2022-12-02 01:14关注
回答:相对来说,我感觉这个线索化是比较难的一个,其余两个则没那么困难,代码如下:
# include <stdio.h> # include <stdlib.h> typedef int Type; int countOfZero = 0; int countOfOne = 0; int countOfTwo = 0; struct Node { Type value; Node* left; Node* right; }; void init(Node* root) { root->value = 10; root->left = NULL; root->right = NULL; Node* node1 = (Node*)malloc(sizeof(Node)); Node* node2 = (Node*)malloc(sizeof(Node)); Node* node3 = (Node*)malloc(sizeof(Node)); Node* node4 = (Node*)malloc(sizeof(Node)); node1->left = NULL; node1->right = NULL; node2->left = NULL; node2->right = NULL; node3->left = NULL; node3->right = NULL; node4->left = NULL; node4->right = NULL; node1->value = 2; node2->value = 4; node3->value = 6; node4->value = 8; root->left = node1; root->right = node2; node1->right = node3; node2->left = node4; } void inorder(Node* root) { if (root == NULL) { return; } inorder(root->left); printf("%d ", root->value); inorder(root->right); } void addNode(Node* head, Node* node) { Node* temp = head; while (temp->right) { temp = temp->right; } temp->right = node; } void getLeafToList(Node* root, Node* head) { if (root == NULL) { return; } getLeafToList(root->left, head); if (root->left == NULL && root->right == NULL) { addNode(head, root); } getLeafToList(root->right, head); } void getCountOfNodeZero(Node* root) { if (root == NULL) { return; } getCountOfNodeZero(root->left); if (root->left == NULL && root->right == NULL) { countOfZero++; } getCountOfNodeZero(root->right); } void getCountOfNodeOne(Node* root) { if (root == NULL) { return; } getCountOfNodeOne(root->left); if ((root->left == NULL && root->right != NULL) || (root->left != NULL && root->right == NULL)) { countOfOne++; } getCountOfNodeOne(root->right); } void getCountOfNodeTwo(Node* root) { if (root == NULL) { return; } getCountOfNodeTwo(root->left); if (root->left != NULL && root->right != NULL) { countOfTwo++; } getCountOfNodeTwo(root->right); } int main() { Node* root = (Node*)malloc(sizeof(Node)); init(root); inorder(root); printf("\n"); // Node* head = (Node*)malloc(sizeof(Node)); // head->value = -100; // head->left = NULL; // head->right = NULL; // // getLeafToList(root, head); // inorder(head); // printf("\n"); getCountOfNodeZero(root); getCountOfNodeOne(root); getCountOfNodeTwo(root); printf("度为0的节点个数:%d\n", countOfZero); printf("度为1的节点个数:%d\n", countOfOne); printf("度为2的节点个数:%d\n", countOfTwo); }
有点晚了,线索化还没写完,可以先凑合看看,我感觉有许多问题,首先就是这个二叉树的建立,好麻烦,明天必须改进一下
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 如何让企业微信机器人实现消息汇总整合
- ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
- ¥15 如何用Python爬取各高校教师公开的教育和工作经历
- ¥15 TLE9879QXA40 电机驱动
- ¥20 对于工程问题的非线性数学模型进行线性化
- ¥15 Mirare PLUS 进行密钥认证?(详解)
- ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
- ¥20 想用ollama做一个自己的AI数据库
- ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
- ¥15 请问怎么才能复现这样的图呀