卡特兰数-N个结点二叉树个数

来源:互联网 发布:linq to sql 编辑:程序博客网 时间:2024/05/16 13:42


      N个结点二叉树个数(不用卡特兰数求解)
对于一个堆栈、若其入栈序列为1,2,3,……,n,不同的出入栈操作将产生不同的出栈序列。其出栈序列的个数正好等于结点个数为n的二叉树的个数,且与不同形态的二叉树一一对应。请简要叙述一种从堆栈输入(固定为1,2,3,……,n)/ 输出序列对应一种二叉树形态的方法,并以入栈序列1,2,3(即n=3)为例加以说明。 



本题考查栈的出入栈操作、二叉树的遍历思想。由于二叉树前序遍历序列和中序遍历序列可唯一确定一棵二叉树。因此,若入栈序列为1,2,3,……,n,相当于前序遍历序列是1,2,3,……,n,出栈序列就是该前序遍历对应的二叉树的中序序列的数目。



——————————补充分割线——————————

好久之前写的了。。。自己现在看起来还是有点晕

补充解释一下,为什么“若入栈序列为1,2,3,……,n,相当于前序遍历序列是1,2,3,……,n

对于入栈序列为1,2,..., n,可以考虑第一个节点,当它出栈的时候,栈必然是空的。也就是说,在出栈序列中,在1左边的都是先于1出栈的,在其右边的都是后于1出栈的,这个关系对应到入栈序列中,显然先于1出栈的节点在入栈序列中的位置是2-x(即是连续的)。这个特点和先序遍历、中序遍历是一致的。


现在看看,觉得这样思考问题比较麻烦,不如先证明入栈-出栈问题的解的个数是一个卡特兰数,然后证明n个结点的二叉树的个数也是一个卡特兰数,即可证明两个问题其实是等价的,这样更通用且简单一些

————————————结束———————————




 

进栈出栈操作与二叉树中序遍历的关系:①一个结点进栈后有两种处理方式:要么立刻出栈(没有左孩子);或者下一个结点进栈(有左孩子)。②一个结点出栈后也有两种处理方式:要么继续出栈(没有右孩子);或者下一个结点进栈(有右孩子)。



原创粉丝点击