线索二叉树

线索二叉树 WHY 方便从任一个结点出发,找到其前驱、后继;方便遍历 普通二叉树中,对任意一个结点,若想找到其前驱/后继结点,只能再进行一次相应的前/中/后序遍历才行,复杂度太高。 为此,我们引入前驱线索,后继线索的概念。其中,前驱线索由左孩子指针充当,后继线索由右孩子指针充当。 typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; 构建出如下图所示的结构: 但是, *lchild(*rchild)有可能指向存在的结点,为此我们引入线索标志。当线索标志为1时,表示孩子指针指向前驱后继,线索标志为0时,表示孩子指针指向左右孩子。此时 typedef struct ThreadNode{ ElemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;//左右线索标志 }ThreadNode,*ThreadTree; 这样,每一个线索链表中的结点就可以图示为: HOW 如何分别用代码实现前中后序遍历下的线索链表 1.中序线索化 其实中序线索化的过程就是再进行一遍中序遍历,为每个节点添加额外的信息(lchild, rcild, ltag, rtag). 🍔初始定义结构体 typedef struct ThreadNode{ ElemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag; }ThreadNode,*ThreadTree; 🍔定义前驱指针 ThreadNode *pre=NULL; 前驱指针还可以定义在局部,这里为了方便起见,将pre定义为全局。 🍔开始定义处理函数 void CreatInThread(ThreadTree T){ pre=NULL; if(T!=NULL){ InThread(T); if(pre->rchild==NULL){ pre->rtag=1; } } } 注意:最后一个节点单独处理...

May 15, 2021 · 1 min · Archai

由遍历序列构造出二叉树

由遍历序列构造出二叉树 仅知道一种遍历序列是无法确定唯一的二叉树的,以中序遍历为例,对于一个中序遍历序列“BDCAE”,其对应的树形结构可能有下面三种: 因此,至少需要两种遍历序列才可以推知树形结构。 1.前序+中序遍历序列 🎈基本步骤 由前序遍历的特性得知,前序遍历中第一个节点必然为根节点,因此根据中序遍历特性,根节点左边为左子树下的所有节点,右边为右子树下的所有节点,然后分别在左子树序列右子树序列中重复进行即可。 🎈示例 前序遍历序列:A D B C E 中序遍历序列:B D C A E 首先能确定根节点为A,根据中序遍历序列可以得到: 对于左子树BDC,根据前序遍历,此子树根节点为D,根据中序遍历序列: 至此,二叉树的还原工作就完成了!至于更复杂的序列,逐步推断即可😋 2.后序+中序遍历序列 🔑与1不用的是,后序遍历中根节点为后序遍历序列尾部的那个节点,其余参照1即可! 3.层序遍历+中序遍历 🔑 根据层序遍历特性,层序遍历中根节点始终在子树前面,“根左右” 🎈示例 层序遍历序列:A D E B C 中序遍历序列:B D C A E 根节点为A,根据中序遍历序列可以得到: 对于左子树BDC,根据前序遍历,此子树根节点为D,根据中序遍历序列: 思考 如果前序,后续,层序两两组合能否确定唯一的树结构? 假设给定序列如下: 前序:A B 后序:B A 层序:A B 其两两组合都满足两种结构: 因此前序,后续,层序两两组合不能确定唯一的树结构。

May 9, 2021 · 1 min · Archai

PHP语法小结

基本语法 输出语句 语句 功能 echo 输出字符串类型 print_r 输出引用类型(对象,数组等) var_dunp 检测变量类型 ::: tip echo语句可用于给前端返回响应体。比如前端通过ajax请求,可以在xhr.response中直接得到echo的内容 ::: 变量&常量 👉🏼 变量 语句 功能 返回值 isset() 检测变量是否存在 boolean unset() 删除某个变量 none 👉🏼 常量 常量用const 或 define 定义,常量名一般全部大写,不受作用域的限制 ::: tip 一般是define在类外定义常量,const在类内定义常量,并且const必须通过类名::变量名来进行访问。但是php5.3以上支持类外通过const定义常量。 ::: :::danger const不能在条件语句中使用,必出错 ::: 参考文章 《PHP中define() 与 const定义常量的区别详解》...

Oct 14, 2020 · 10 min · Archai

JavaScript生成图片文件路径json

在写小demo的过程中,经常需要把某个文件夹的图片文件的路径给引入,除非全部重命名成有序的数字,不然不好处理,这就用到了node中的fs和path模块,还没学… const path=require("path"); const fs = require('fs'); fs.stat('../images',(err)=>{//图片文件所在目录 if (err)return; var result='{' fs.readdir("../images",(err,data)=>{//图片文件所在目录 for(var i=0;i<Object.keys(data).length;i++){ let ImgPath="\"images/"+data[i]+"\""; result+="\""+i+"\":"+ImgPath+","; } result=result.substring(0,result.length-1); let length="\""+"length"+"\""+":"+"\""+Object.keys(data).length+"\""//文件数量 result+=","+length+'}' fs.writeFile("../data/imgPath.json",result,(err)=>{ if(err)return; console.log("写入文件成功,一共"+Object.keys(data).length+"个文件"); }); }); }); 生成的文件大概就是这样的一个json数据 {"0":"images/1.jpg","1":"images/10.jpg","2":"images/100.jpg","3":"images/101.jpg","4":"images/102.jpg","5":"images/103.jpg","6":"images/104.jpg","7":"images/105.jpg","8":"images/106.jpg","9":"images/107.jpg","10":"images/108.jpg","length":"109"}

Jul 5, 2020 · 1 min · Archai

python中关于文件的种种问题

在python中,我们可以将那些在运行时可能会出现状况的代码放在try代码块中,在try代码块的后面可以跟上一个或多个except来捕获可能出现的异常状况。 FileNotFoundError,文件找不到 LookupError指定了未知的编码 UnicodeDecodeError读取文件时无法按指定方式解码 def main(): f = None try: f = open('致橡树.txt', 'r', encoding='utf-8') print(f.read()) except FileNotFoundError: print('无法打开指定的文件!') except LookupError: print('指定了未知的编码!') except UnicodeDecodeError: print('读取文件时解码错误!') finally: if f: f.close() if __name__ == '__main__': main() finally块的代码不论程序正常还是异常都会执行到(甚至是调用了sys模块的exit函数退出Python环境,finally块都会被执行,因为exit函数实质上是引发了SystemExit异常),因此我们通常把finally块称为“总是执行代码块”,它最适合用来做释放外部资源的操作。 或者, with关键字指定文件对象的上下文环境并在离开上下文环境时自动释放文件资源 def main(): try: with open('致橡树.txt', 'r', encoding='utf-8') as f: print(f.read()) except FileNotFoundError: print('无法打开指定的文件!') except LookupError: print('指定了未知的编码!') except UnicodeDecodeError: print('读取文件时解码错误!') if __name__ == '__main__': main()

Jun 26, 2020 · 1 min · Archai