二叉树的前序、中序、后序遍历的递归版本非常好理解,在这里就不在赘述了。这里主要讲迭代版本。事实上,计算机在进行递归调用时,会隐式的维护一个栈(叫做调用栈,CallStack),调用函数就把局部变量、入参、返回地址(合起来叫做栈帧,StackFrame)一同入栈,从函数返回就出栈。而迭代版本其实就是把这个过程显式的表现出来,手动的去维护这个栈。同时,迭代版本只需要把节点指针入栈出栈,占用的空间也会小一些。前序遍历因为前序遍历的递归版本是所谓的“尾递归”(即递归调用发生在函数体的尾部),将尾递归转换为迭代相对容易一些:voidpostOrder(TreeNode*root){//如果根节点为空,直
关于最近最近在看算法相关的,接下来想记录一下自己学习的、个人认为比较值得记录的算法。这篇博客主要是用自己的理解复述了根据中序、前序遍历重建二叉树这个博客的内容,大家可以主要看这个博客,我写得不如远矣。根据前序和中序遍历重建二叉树我们知道前序、中序、后序遍历二叉树有很多方法,比如递归进行遍历,使用栈/队列进行深度/广度优先遍历,更有甚者使用Morris方法进行额外空间复杂度为O(1)的遍历,但从遍历后的序列重建二叉树就比较麻烦。这里描述一下从前序遍历序列和中序遍历序列重构二叉树的方法,要求二叉树没有重复的元素。这里我先给出二叉树节点的定义:structTreeNode{public:TreeNo
关于最近最近在看算法相关的,接下来想记录一下自己学习的、个人认为比较值得记录的算法。这篇博客主要是用自己的理解复述了根据中序、前序遍历重建二叉树这个博客的内容,大家可以主要看这个博客,我写得不如远矣。根据前序和中序遍历重建二叉树我们知道前序、中序、后序遍历二叉树有很多方法,比如递归进行遍历,使用栈/队列进行深度/广度优先遍历,更有甚者使用Morris方法进行额外空间复杂度为O(1)的遍历,但从遍历后的序列重建二叉树就比较麻烦。这里描述一下从前序遍历序列和中序遍历序列重构二叉树的方法,要求二叉树没有重复的元素。这里我先给出二叉树节点的定义:structTreeNode{public:TreeNo
力扣105根据先序遍历以及中序遍历构建二叉树题目:给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]输出:[3,9,20,null,null,15,7]示例2:输入:preorder=[-1],inorder=[-1]输出:[-1]解题思路:先序遍历是“根左右”所以先序遍历数组中的第一个元素肯定是整棵树的根节点,中序遍历是“左根右”所以根节点将左子树的节点元素与右子树的节点元素分隔开来。我们
力扣105根据先序遍历以及中序遍历构建二叉树题目:给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]输出:[3,9,20,null,null,15,7]示例2:输入:preorder=[-1],inorder=[-1]输出:[-1]解题思路:先序遍历是“根左右”所以先序遍历数组中的第一个元素肯定是整棵树的根节点,中序遍历是“左根右”所以根节点将左子树的节点元素与右子树的节点元素分隔开来。我们
文章整理自博学谷狂野架构师重排序数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称代码示例说明写后读a=1;b=a;写一个变量之后,再读这个位置。写后写a=1;a=2;写一个变量之后,再写这个变量。读后写a=b;b=1;读一个变量之后,再写这个变量。上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。注意,这里所说的数据依赖性仅针对单个处理器中执
文章整理自博学谷狂野架构师重排序数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称代码示例说明写后读a=1;b=a;写一个变量之后,再读这个位置。写后写a=1;a=2;写一个变量之后,再写这个变量。读后写a=b;b=1;读一个变量之后,再写这个变量。上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。注意,这里所说的数据依赖性仅针对单个处理器中执
MySQL8新增降序索引 桃花坞里桃花庵,桃花庵里桃花仙。桃花仙人种桃树,又摘桃花卖酒钱。 一、MySQL5.7降序索引MySQL在语法上很早就已经支持降序索引,但实际上创建的却仍然是升序索引,如下MySQL5.7所示,row2字段降序,但是从showcreatetable看row2 仍然是升序的。CREATETABLEt_desc_index(row1INT,row2INT,INDEXidx_row1_row2(row1,row2DESC));SHOWCREATETABLEt_desc_index二、MySQL8降序索引在MySQL8中,以同样的方式创建降序索引row2,showcrea
MySQL8新增降序索引 桃花坞里桃花庵,桃花庵里桃花仙。桃花仙人种桃树,又摘桃花卖酒钱。 一、MySQL5.7降序索引MySQL在语法上很早就已经支持降序索引,但实际上创建的却仍然是升序索引,如下MySQL5.7所示,row2字段降序,但是从showcreatetable看row2 仍然是升序的。CREATETABLEt_desc_index(row1INT,row2INT,INDEXidx_row1_row2(row1,row2DESC));SHOWCREATETABLEt_desc_index二、MySQL8降序索引在MySQL8中,以同样的方式创建降序索引row2,showcrea
问题描述近期业务反馈,开启了mini-batch之后,出现了数据不准的情况,关掉了mini-batch之后,就正常了,因此业务方怀疑,是不是Flink的mini-batch存在bug?问题排查初步分析mini-batch已经在内部大规模使用,目前没有发现一例和开启mini-batch有关,同时mini-batch本质只是将数据进行攒批然后计算,并没有修改核心的运算逻辑.开关mini-batch的关键时数据的批量计算,是否在批量计算使得原本存在bug的代码暴露问题业务在FlinkSQL使用了多个双流join和groupwindow,如果不注意使用,很可能导致乱序,最终的错误结果是某条数据没有被正