美文网首页
围绕二叉树的一些写递归方法的总结

围绕二叉树的一些写递归方法的总结

作者: idolice24 | 来源:发表于2018-10-16 14:31 被阅读0次

首先,我们先把二叉树的前中后遍历用递归写一遍:

先定义二叉树数据结构:

Public classTreeNode {

public intvalue;

    publicTreeNodeleft;

    publicTreeNoderight;

}

前序遍历:

public voidforeSearch(TreeNode treeNode) {

if(treeNode ==null) {

return;

   }

System.out.print(treeNode.value);

   foreSearch(treeNode.left);

   foreSearch(treeNode.right);

}

中序遍历:

public voidmiddleSearch(TreeNode treeNode) {

if(treeNode ==null) {

return;

   }

middleSearch(treeNode.left);

   System.out.print(treeNode.value);

   middleSearch(treeNode.right);

}

后序遍历:

public voidbackSearch(TreeNode treeNode) {

if(treeNode ==null) {

return;

   }

backSearch(treeNode.left);

   backSearch(treeNode.right);

   System.out.print(treeNode.value);

}

是不是简单到爆?可是在第一次写这个递归的时候总是没有把握,并且时常写递归写完后就算是对的也不知道自己为什么这么写,在我看来递归本来就算是很难理解得一个东西了,能把递归理解得很好很不错啦(也可能是我自己太笨)。

那我们来一步一步分析怎么写的这个前序遍历,首先,我们要确定这个遍历它的规律,因为递归你一定是每次执行都符合同一个规律,这样才能使用同样的代码嘛。

分析它的数据结构了,三部分:当前节点,左子树,右子树,对不对,每个子树又包含这三个部分 ,以此重复,什么时候完呢?就是当子树不存在了,说明这个树到底了,对不对。

那么前序遍历规律出来了,先根节点,然后左节点,然后右节点,遍历结果为:

临界条件为:子树为空。

那么我们就写个方法,遍历树的,foreSearch(),递归很重要的地方在于,找到跳出递归的条件,这里的条件是子树为空,遍历的关键代码:

首先遍历根嘛,我们这里就打印根节点:System.out.print(treeNode.value);

打印完根节点后,我们要遍历左边的节点,又由于左边的节点可能是一个子树,对吧,对于子树的遍历我们仍然是先根节点再左再右,跟我们定义的foreSearch方法一样的,那么我们便调用自己:foreSearch(treeNode.left);它会遍历左子树,然后需要继续遍历右子树:

foreSearch(treeNode.right);最后定义跳出递归的条件:

if(treeNode ==null) {

return;

   }

好,再换个场景,求二叉树的最大深度,首先,我们要分析一棵二叉树的最大深度等于什么? 是不是得考虑到底是左子树更深还是右子树更深? 那我们是不是就要求左子树的深度和右子树的深度?然后再得到最大那个深度加上1就是该子树的最大深度了?

好的我们知道了这里能够重复的方法就是求树的深度的方法,因为求当前节点的最大深度和求左子树的最大深度的方法是一样的,那么我们来定义一个求树深度的方法:

public intgetMostDeepth(TreeNode treeNode) {

}

然后我们是不是求左子树的深度?intleftDeep = getMostDeepth(treeNode.left);

然后求右子树的深度:intrightDeep = getDepth(treeNode.right);

最后树的长度为左右子树长度更长的那个值加1:returnleftDeep > rightDeep ? leftDeep +1: rightDeep +1;

OK方法已经组合好了:

public intgetMostDeepth(TreeNode treeNode) {

intleftDeep = getMostDeepth(treeNode.left);

    intrightDeep = getDepth(treeNode.right);

    returnleftDeep > rightDeep ? leftDeep +1: rightDeep +1;

}

现在还缺什么呢,就是跳出递归的条件,大家想想到什么情况下就不再继续了,那就是子树为空了嘛,已经到叶节点了是不是就不再往下了嘛,那么跳出条件仍然是treeNode ==null,当节点为空时,说明了什么,说明该节点的深度为0,那么我们就返回0就是了:

public intgetMostDeepth(TreeNode treeNode) {

   if(treeNode ==null) {

       return0;

   }

   intleftDeep = getMostDeepth(treeNode.left);

    intrightDeep = getDepth(treeNode.right);

    returnleftDeep > rightDeep ? leftDeep +1: rightDeep +1;

}

完整方法就出来了,是不是很容易?

这里总结几点就是:

1.总结规律,你知道你是在写一个递归方法,那么就得定义出这个递归方法是干什么的。

2.调用自己

3.跳出条件,跳出时的判断条件是什么以及当前条件下该返回什么。

需要注意的是,如果你的跳出条件有问题的话,递归很容易产生stackoverflow。

好吧,可能写完还是没什么帮助,就当我自己给自己记录下,因为递归确实很难理解。

相关文章

  • 围绕二叉树的一些写递归方法的总结

    首先,我们先把二叉树的前中后遍历用递归写一遍: 先定义二叉树数据结构: PublicclassTreeNode {...

  • 数据结构——树

    有关树的算法题总结 实现二叉树的前序、中序、后序遍历(递归、非递归,mirros方法) 查找后继节点 二叉树的序列...

  • Leetcode.124.Binary Tree Maximum

    题目 给定义一个二叉树, 求二叉树的子路径的最大和. 思路 递归. 分别对左右子树递归. 总结 递归求最大值, 需...

  • 二叉树——对称二叉树

    二叉树由于其本身具有递归特性,所以绝大部分二叉树的算法题用递归的方法都很好解。如果不用递归方法,也可以使用堆栈以及...

  • 算法-二叉树算法总结

    二叉树算法总结 1 二叉树的遍历 1.1 前序遍历 递归 迭代 1.2 中序遍历 递归 迭代 1.3 后序遍历 递...

  • LeetCode题解之翻转二叉树

    翻转二叉树 题目描述 翻转一棵二叉树。 示例 : 输入: 输出: 解题思路 方法一:递归 使用递归来翻转二叉树。 ...

  • 二叉树的三种深度优先遍历算法与思路

    看了一些关于二叉树遍历算法的文章,例如:二叉树三种遍历方式的递归和循环实现二叉树的递归与非递归遍历(前序、中序、后...

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • 二叉树:遍历、搜索

    二叉树 递归方法太简单了,这里就贴上几种不同的非递归实现,前中后

  • 剑指offer最优解Java版-平衡二叉树

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解决方法一:递归 遍历每个结点,借助一个获取树深度的递归...

网友评论

      本文标题:围绕二叉树的一些写递归方法的总结

      本文链接:https://www.haomeiwen.com/subject/zlrhzftx.html