因为每一趟扫描都会记录是否发生了交换,如果没发生交换则排序完成不再扫描,所以最好的情况下时间复杂度为O(n)
最坏情况下的比较次数为(n-1)+(n-2)+...+1=n(n-1)/2
这个例子起始不大能说明问题,其实尾递归比普通递归效率要高,所以不需要消除尾递归
方法1:通过给节点设置L、R标签,如果栈顶的是非空节点且标签为L,则在回退时访问该节点的右子树
如果栈顶是非空节点且标签为R则在退回时将该节点出栈,访问其根节点
方法2:设置一个count,记录每个节点的回退次数,第一次回退到该节点的啥时候访问右节点,第二次
需要待左右节点都出栈后,双亲节点才能出栈,每个节点在出栈的时候输出其val,这样就得到后序序列
进栈顺序为双亲节点先进栈,然后访问左子节点;当双亲节点出栈的时候右子节点进栈;
每个节点在出栈的时候输出其val,这样就得到中序序列
进栈顺序为双亲节点先进栈,然后访问左子节点;当双亲节点出栈的时候右子节点进栈;
每个节点在进栈的时候输出其val,这样就得到前序序列
每个节点均在入队(或出队)时输出其val,这样就得到层序序列
每次递归中,都定位前序序列第一个元素在中序序列中的位置,即可得到左子树和右子树的序列,从而可以进行下一步递归
线索二叉树就是添加了线索的二叉树,线索即指向前驱和后继的指针
可以画出具体的二叉搜索树来分析搜索成功的平均搜索次数和搜索失败的平均搜索次数
特殊情况,对于搜索概率不同的元素,按照搜索概率从高到低排序,可以得到较好的平均搜索长度