由二叉树的定义我们知道它是由递归方法来定义的,所以一些关于它的处理我们也可以用递归方法求解,不过由于递归方法有可能会降低处理的速度,增加时间复杂度,有些时候非递归方法能够更好地解决问题。
一些操作运用递归可能大同小异,下面给出几个,主要靠自己领会二叉树的特点:
1、求二叉树的节点个数:
递归:若二叉树为空,则返回0;
二叉树不为空,则返回左子树节点数+右子树结点数+1;
2、求二叉树的深度:
递归:若二叉树为空,返回0;
二叉树不为空,则返回max(左子树深度,右子树深度)+ 1;
3、由前序遍历序列和中序遍历序列重建二叉树(或求得二叉树的后序遍历序列)
递归:若前序遍历或中序遍历为空或节点数小于等于0,返回NULL;
创建根节点,前序遍历的第一个数据就是根节点的数据,在中序遍历中找到根节点的位置,分别得知左子树和右子树的前序和中序遍历序列,递归重建二叉树;
如果是要求的后序遍历的序列则可以不用重建而是在分别得到左子树和右子树后递归求得左边的所有节点再求右边的所有节点,最后输出自己的节点;
4、层次遍历
使用队列,从根节点开始访问节点,同时将根节点加入队列,之后每一个访问的节点都是从队列中取出的点的左右儿子节点(如果有,否则就取出即可),同理访问过后再将他们加入队列,知道队列为空。
5、求二叉树第k层节点的个数(可以同理转换为求叶子节点的个数)
递归,分别从左右儿子节点出发,每下降一层k值减1,到k层遇到叶子就返回1,再将左右儿子得到的叶子数相加。
6、判断两棵树是否相同
两棵树相同包括以下条件:1、结构相同,如,你有左儿子我也都有;
2、值相同,每个节点所对应的点值必须一致,知道遍历完所有的节点;
7、判断一棵树是否是镜像
镜像值以根节点为对称轴,左右两棵子树对应节点相同;
首先,当然必须保证结构相同,对应的节点是要么都存在,要么都没有;
其次,就是对应结构相同;
注意,对称后如左子树的左儿子对应的应该是右子树的右儿子;
8、求二叉树中两节点的最低公共祖先节点
递归,如果两点分别在左右子树中,则根节点即为所求的点;(适用于BST中)
如果,在一边,则递归;
非递归,分别求根节点到他们呢路径,路径最后相同的点就是公共祖先节点了(适用于一般二叉树)
9,关于BST(二叉查找树)
二叉查找树的特点:对于一个节点,其左子树的所有值小于其值,右子树所有值大于其值;
故,中序遍历的结果是一个非减的数列,根据这个特点可以应用于很多题中
具体应用:点击打开链接
......前序遍历、中序遍历、后序遍历、判断两个二叉树是否相同等题都可以用递归求得解