如题:任给二叉树,求它的节点值最大的那个值?
public int maxTreeNode(TreeNode root) {
if (root.left == null && root.right == null) {
return root.val;
} else {
if (root.left != null && root.right != null) {
return root.val > maxTreeNode(root.left) ? (root.val > maxTreeNode(root.right) ? root.val
: maxTreeNode(root.right))
: (maxTreeNode(root.left) > maxTreeNode(root.right) ? maxTreeNode(root.left)
: maxTreeNode(root.right));
} else if (root.left == null && root.right != null) {
return root.val > maxTreeNode(root.right) ? root.val
: maxTreeNode(root.right);
} else {
return root.val > maxTreeNode(root.left) ? root.val
: maxTreeNode(root.left);
}
}
}说说我第一次的错误想法,在方法中定义max用来保存遍历得到的最大值,结果每次递归时,都等于在重新定义max,这种方法不对,但我又在想难道递归过程中就不能有一个值来保存我们想要得到的值吗?对递归认识还不够,很多二叉树的题用递归方法来解很简单。晚上好好看看这个递归算法。
递归过程中,变量值怎么独立变化?设置一个全局变量。
递归的重新认识
什么叫递归?直接或间接的调用自身叫递归。
递归算法设计就是:把一个大型复杂的问题层层转化成一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)到大问题的解。
关键步骤:1.找出递归关系(递归方程,即问题向边界问题转化的规则)2.递归终止条件(边界条件)
设计递归步骤:
1)分析问题,寻找递归关系:找出大规模问题与小规模问题的关系,这样通过递归使问题规模逐渐变小
2)设置边界,控制递归:找出停止条件,及算法停止的最小规模问题
3)设计函数确定参数
递归和循环:每个迭代算法原则上总可以转换成与它等价递归算法,但并不是每个递归算法都可转换成与之等价的循环迭代算法。(可以问问为什么?)
常见递归算法问题:汉诺塔问题,