icoding复习5 树 感觉难度巨大....

icoding 复习5 

1. 先序遍历 
已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法:
void pre_order(BiTree root);
二叉树的相关定义如下:
typedef int DataType;
typedef struct Node{
    DataType data;
    struct Node* left;
    struct Node* right;
}BiTNode, *BiTree;
遍历所使用栈的相关操作如下:
#define Stack_Size 50
typedef BiTNode* ElemType;
typedef struct{
    ElemType elem[Stack_Size];
    //BiTNode*  elem[Stack_Size]
    int top;
}Stack;
void init_stack(Stack *S); // 初始化栈
bool push(Stack* S, ElemType x); //x 入栈
bool pop(Stack* S, ElemType *px); //出栈,元素保存到px所指的单元,函数返回true,栈为空时返回 false
bool top(Stack* S, ElemType *px); //获取栈顶元素,将其保存到px所指的单元,函数返回true,栈满时返回 false
bool is_empty(Stack* S);  // 栈为空时返回 true,否则返回 false
在遍历过程中,pre_order函数需要调用 visit_node 函数来实现对结点的访问,该函数声明如下:
void visit_node(BiTNode *node);
#include
#include
#include "bitree.h" //请不要删除,否则检查不通过

大概率考原题和改编!!!!!! 

void pre_order(BiTree root){
    if(!root) return;
    Stack *S;
    
    BiTNode *p;
    
    init_stack(S);
    push(S, root->data);
    while(!is_empty(S)){
        pop(S, &p);
        visit_node(p);
        
        if(p->left)
            push(S, p->left);
        if(p->right){
            push(S, p->right);
        }
    } 
}
//解法2, 声明为Stack S; 
void pre_order(BiTree root)
{
    Stack S;
    BiTNode *p, *q;

    //    S.top = -1; 初始化应该会赋值
    p = root;
    init_stack(&S);

    if (p == NULL)
        return;
    do {
        if (p) {
            visit_node(p);//先序遍历的核心,先访问根节点 
            push(&S, p);
            p = p->left;
        } else {
            pop(&S, &p);
            p = p->right;
        }
    } while (p || !(is_empty(&S)));
}

//中序遍历
void InOrder(BiTNode *root){
    Stack *S; BiTNode *p;
    init_stack(S);
    if(!root ) return;
    while(p || !is_empty(S)){
        while(p){
            push(S, p);
            p = p->left;
        }
        if(!is_empty(S)){
            pop(S, &p);
            visit_node(p);
            p = p->right;
        }
    }

//后序遍历非递归 难 
void PostOrder(BiTNode *root){
    Stack *S; BiTNode *p, *r; bool flag;
    init_stack(S);
    p = root;
    do{
        while(p){
            push(S, p);
            p = p->left;
        }
        r = NULL;
        flag = true;
        
        while(!is_empty(S) && flag){
            top(S, &p);
            if(p->right == r){
                visit_node(p);
                pop(S, &p);
                r = p;
            }
            else{
                p = p->right;
                flag = false;
            }
        }
    }while(!is_empty(S));

2. 路径 
假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点,
编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点)。path 函数声明如下:
bool path(BiTNode* root, BiTNode* node, Stack* s);
其中,root指向二叉树的根结点,node指向二叉树中的另一结点,s 为已经初始化好的栈,
该栈用来保存函数所计算的路径,如正确找出路径,则函数返回 true,此时root在栈底,node在栈顶;

#include "bitree.h" //请不要删除,否则检查不通过
#include
#include

bool path(BiTNode* root, BiTNode* node, Stack* s){
    BiTNode *p, *q;
    
    if(!root || !node)    return false;
    p = root;
    if(p == node){
        push(s, p);
        return true;
    }
    
    while(p || !is_empty(s)){
        while(p){//先压入再判断 
            push(s, p);
            if(p == node)
                return true;
            
            p = p->left;
        }
        top(s, &p);
        if(p->right == q || p->right == NULL){
            q = p;
            top(s, &p);
            p = NULL;
        }
        else
            p = p->right;
    }
    return true;
}


3. 共同祖先
假设二叉树采用二叉链表方式存储, root指向根结点,p所指结点和q所指结点为二叉树中的两个结点,
编写一个计算它们的最近的共同祖先,函数定义如下:
BiTNode * nearest_ancestor(BiTree root, BiTNode *p, BiTNode *q);
其中 root 指向二叉树的根结点,p 和 q 分别指向二叉树中的两个结点。
提示:在完成本题时,可利用 path 函数获取p和q两个结点到根结点之间的路径,
之后再计算两条公共路径得出最近的共同祖先。path函数及栈相关定义如下:


#include
#include
#include "bitree.h" //请不要删除,否则检查不通过

BiTNode * nearest_ancestor(BiTree root, BiTNode *p, BiTNode *q){
    if(!root || !p || !q) return NULL;
    Stack *s1, *s2;
    init_stack(s1); init_stack(s2);
    path(root, p, s1);
    path(root, q, s2);
    for(int i = 0; s1->elem[i] == s2->elem[i]; i++) 
        ;
    return s1->elem[i-1];

4. 树转二叉树
使用队列,编写transfrom函数,将普通树转换成对应的二叉树。二叉树的相关定义如下:
typedef int DataType;
typedef struct Node{
    DataType data;
    struct Node* left;
    struct Node* right;
}BiTNode, *BiTree;

普通树节点 的定义如下:
#define MAX_CHILDREN_NUM 5
struct _CSNode
{
    DataType data;
    struct _CSNode *children[MAX_CHILDREN_NUM];
};
typedef struct _CSNode CSNode;
其中,子树的根节点的指针存放在children数组的前k个元素中,即如果children[i]的值为NULL,
而children[i-1]不为NULL,则表明该结点只有i棵子树,子树根结点分别保存在children[0]至children[i-1]中。
队列相关定义及操作如下:
struct __Queue
{
    int i, j; //指向数组内元素的游标
    void **array;//这个就是提示!!!!!!!!!!!!!!!!!!!!!!!!!!! 
};
typedef struct __Queue Queue;

Queue* create_queue(); //创建队列
bool is_empty_queue(Queue *tree); //队为空返回true,不为空时返回false
void* del_queue(Queue *tree); //结点指针出队
void add_queue(Queue *tree, void *node); //结点指针入队
void free_queue(Queue *tree); //释放队列
transform函数定义如下:

BiTNode* transform(CSNode *root);
其中 root 为普通树的根结点,函数返回该树对应二叉树的根结点。


#include
#include
#include "bitree.h" //请不要删除,否则检查不通过 
 
BiTNode* transform(CSNode *root){
    if(!root) return NULL;
    
    Queue *que, *bque;
    
    BiTNode *p;
    //二叉树根结点创立 
    //小心点, 记得分配空间 
    //为什么想到建立二叉树结点?
    //普通树结点和二叉树结点无法强制类型转换 
    p = (BiTNode *)malloc(sizeof(struct Node));
    p->data = root->data;
    p->left = p->right = NULL;
     
    
    que = create_queue();
    bque = create_queue();
    //建立双队目的在于建立有序二叉结点序列 
    add_queue(que, root);
    add_queue(bque, p);
    
    //注意这个while怎么处理好孩子与孙子关系的, 没用递归!!! 
    while(!is_empty_queue(que)){
        BiTree bq;//创建二叉树队列头结点(根结点) 
        bq = del_queue(bque);
        CSNode *q;
        q = del_queue(que);
        //第一次执行该操作就相当于建立了二叉树的根
        
        int i = 0; 
        BiTNode *former = NULL;
        
        for(i = 0; i < MAX_CHILDREN_NUM; i++){
            if(q->children[i]){//判存在 
                BiTNode *bnode = (BiTNode *)malloc(sizeof(struct Node));
                bnode->data = q->children[i]->data;
                bnode->left = bnode->right = NULL; 
        
                //放置结点位置
                if(i == 0){
                    bq->left = bnode;
                }
                else{//兄弟变为孩子了可怜 
                    former->right = bnode;
                }
                former= bnode;
                 
                add_queue(bque, bnode);
                add_queue(que, q->children[i]);
            }
        }     
    }
    free(que->array);
    free(que);
    free(bque->array);
    free(bque);
    
    return p;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 进行一元线性回归并输出相关结果_Python实现一元线性回归实战

回归是一种有监督的学习方式&#xff0c;需要根据历史数据对未知数据做出预测。在此&#xff0c;以房屋面积预测房屋价格为例&#xff1a;首先&#xff0c;读入数据&#xff1a;代码如下&#xff1a;import pandas as pdimport numpy as npfrom io import StringIOfrom sklearn…

《C++ Primer》第一章的 Sales_item.h头文件源码

Sales_item.h不是C自带的&#xff0c;需要自己安装&#xff0c;这个库作者已经写好了, Sales_item.h 头文件代码如下&#xff1a; #ifndef SALESITEM_H #define SALESITEM_H #include <iostream> #include <string>class Sales_item{ public:Sales_item(const std…

icoding复习7, 8

icoding复习7 哈希,AVL 查找 必考点!!! 1. 哈希表创建 typedef enum{ HASH_OK, HASH_ERROR, HASH_ADDED, HASH_REPLACED_VALUE, HASH_ALREADY_ADDED, HASH_DELETED, HASH_NOT_FOUND, } HASH_RESULT; typedef struct __HashEntry HashEntry; struc…

python加载模型包占用内存多大_加载pickle python对象会占用大量内存

我有一个python的pickle对象,它生成一个180 Mb的文件.当我取消它时,内存使用量会爆炸到2或3Gb.你有类似的经历吗&#xff1f;这是正常的吗&#xff1f;对象是包含字典的树&#xff1a;每个边是一个字母,每个节点都是一个潜在的单词.因此,要存储一个单词,您需要的边数与该单词的…

《C++ Primer》1.52节练习

练习1.23 #include <iostream> #include "Sales_item.h"using namespace std;int main() {Sales_item trans1, trans2;cout << "请输入若干销售记录:" << endl;if (cin >> trans1) {int num 1;while (cin >> trans2)if (t…

ASP.NET Core 反向代理部署知多少

引言最近在折腾统一认证中心&#xff0c;看到开源项目[IdentityServer4.Admin&#xff1a;https://github.com/skoruba/IdentityServer4.Admin]集成了IdentityServer4和管理面板&#xff0c;就直接拿过来用了。在尝试Nginx部署时遇到了诸如虚拟目录映射&#xff0c;请求头超长、…

函数传参string_JavaScript 高阶函数入门浅析

原文&#xff1a;https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/译者&#xff1a;jingruzhang校对者&#xff1a;acusp高阶函数高阶函数可以接收函数作为参数&#xff0c;同时也可以返回一个新的函数。高阶函数之所以…

all()与any()

all():当可迭代对象为空时返回True。或者当可迭代对象中是否所有值都为True&#xff0c;所有值都为True,则返回True。否则返回False。any():当可迭代对象为空时返回False。或者当可迭代对象中是否存在一个为True的值&#xff0c;若存在&#xff0c;返回True,否则返回False 示例…

.NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记...

13 | 配置绑定&#xff1a;使用强类型对象承载配置数据要点&#xff1a;1、支持将配置值绑定到已有对象2、支持将配置值绑定到私有属性上继续使用上一节代码首先定义一个类作为接收配置的实例class Config {public string Key1 { get; set; }public bool Key5 { get; set; }pub…

Python--第3次平时作业

目录 一、单项选择题 二、程序填空题 三、所有测试代码如下: 一、单项选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 C A A C C D D D D C 题号 11 12 13 14 15 16 17 18 19 20 答案 A A C C B C A C B A 题号 21 22 23 24 25 …

工业互联网白皮书_发布|《工业互联网平台安全白皮书(2020)》发布

12月4日&#xff0c;2020年中国工业信息安全大会暨全国工控安全深度行(京津冀站)在北京国际会议中心举行。大会由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办&#xff0c;以“贯彻总体国家安全观&#xff0c;把牢工控安全基准线”为主题。会上&#xff0c;国家…

UVA - 514 Rails-栈

某城市有一个火车站&#xff0c;铁轨铺设如图6-1所示。 有n节车厢从A方向驶入车站&#xff0c;按进站顺 序编号为1&#xff5e;n。 你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出 车站。 例如&#xff0c;出栈顺序(5 4 1 2 3)是不可能的&#xff0c;但(5…

全局思维

在这个复杂多变的时代&#xff0c;是时候提升我们的思维了&#xff0c;树立大局意识&#xff0c;在把握空间纵轴线和时间水平线中思考和谋划大局。全局思维能力&#xff0c;蕴含着从全局的、长远的、战略的高度来分析问题和解决问题的能力&#xff1b;是善于从大处着眼、小处着…

python中函数的参数类型( 位置参数、关键字参数、默认值参数和可变长度参数)

目录 位置参数: 关键字参数: 默认值参数: 可变长度参数: 1.元组可变长度参数 : 2.字典可变长度参数: 附上练习代码: 位置参数: 实参与形参个数完全相同,按位置按顺序将实参传递给形参 def f(x, y):print(x, y) f(2, 3) 2, 3 关键字参数: 在函数调用中使用关键字参数&…

python分布式存储文件_python如何分布式存储文件的方法

想了很久&#xff0c;还是跟大家聊一聊关于分布式吧&#xff0c;只是因为大家在编写代码&#xff0c;填充内容时候&#xff0c;最多肯定是涉及文字以及图片&#xff0c;因此对于这些内容后期做代码存储肯定至关重要&#xff0c;没有任何一个用户会直接看代码来认知你的产品&…

UVA-11988 悲剧文本-静态链表

你有一个破损的键盘。键盘上的所有键都可以正常工作&#xff0c;但有时Home键或者End键会自 动按下。你并不知道键盘存在这一问题&#xff0c;而是专心地打稿子&#xff0c;甚至连显示器都没打开。当你 打开显示器之后&#xff0c;展现在你面前的是一段悲剧的文本。你的任务是在…

ASP.NET Core Razor 视图预编译、动态编译

0x01 前言ASP.NET Core在默认发布情况下&#xff0c;会启动预编译将试图编译成xx.Views.dll,也许在视图中打算修改一处很细小的地方我们需要再重新编译视图进行发布。下面我将从 ASP.NET Core 3 之前版本到 ASP.NET Core 3X 之后版本的一个配置列下下方供大家参考。0x02 预编译…

最大公约数,最小公倍数,质因式分解

目录 简单代码算出最大公约数,最小公倍数: 辗转相除法得到最大公约数: 两数相乘倒序最小公倍数: 分解质因式, 打印输出, 并且存到列表 主程序: 由质因式得到最小公倍数: 简单代码算出最大公约数,最小公倍数: # 最大公约数和最小公倍数 a int(input(please enter 1st num:)…

群晖python套件包_利用群晖Docker安装ubuntu16.04搭建python网站服务器(部署篇)

在帖子《利用群晖Docker安装ubuntu16.04搭建python网站服务器(安装篇)(地址&#xff1a;http://www.cirdown.com:81/thread-185-1-1.html)》中介绍了在群晖docker中如何安装和配置ubuntu容器&#xff0c;那么服务器系统有了&#xff0c;这篇我们就来讲部署篇&#xff0c;因为我…