涉及到前序,中序,后序这种去遍历二叉树的,一般都用递归去做,去仿照这几种遍历用到的递归方法;
中序遍历加上其余的任何一种遍历方式都可以获得唯一的一个二叉树,因为中序遍历如果知道了root则可以知道左右子树情况,而其他方式可以获得root
一般如果一个void function要用到递归,则其递归停止条件一般都是if(...==null) return ;(重点在于这个return空)
一开始也最好先检验root是否为null,以及如果是null要怎么操作怎么return
在有关tree的题中,因为大多数tree结构的对称性,所以常常运用到递归,回溯等这类方法去将大问题分解成在左子树与右子树身上也一样的子问题,从而在左子树与右子树身上进行递归
且结构一般写为:递归终止条件+递归左右子树+递归body
递归终止条件一般为当root为null时return...;
递归的body则是有了root和已解决问题的左子树和右子树之后要怎么组装出答案并return什么给上一级;这里一般都会以前序中序后序遍历为基本框架,根据题目特点去选择合适的递归顺序,然后把这个框架的细节填满(比如前序的特点是第一个node为root,中序的特点是升序排列),因为递归一般是用已解决的左右子树问题去解决root问题,所以要先得出左右子树的东西再去解决root的东西,所以中序和后序用的比较多
且在这些递归问题中,一般会在主function外另写一个递归的help function,这个另写的function一般是方便了参数或是return等等方面的问题,因为一般主function由于参数以及return被限制好,操作起来很难都照顾到,若是为了方便参数,则这个另外的function一般是会有这两个参数,一个左边界一个右边界, 且递归条件一般可以设置为if(left>right) return ...;
在树的递归做法中,有时需要值的累加,或是需要得到一个最值等等,但递归由于每次都会经过function body所以无法在function body中去设定一个变量去完成累加或比较目前最值大小,这时可借助一个全局变量放在这个递归function外,在递归body里对这个全局变量的操作可以直接保持最新纪录。
且每次的递归body中一般return的也就是这个全局变量
全局变量不只有以上两种用途,也可以用在其他地方,视情况选择
求树的height,用递归