将二叉树的递归代码框架中的两种情况对比。一种是先递归左子节点,另外一种是先递归右子节点。
将从代码框架内容和输出顺序以及使用场景两个方面进行对比。
注:leetcode刷题的学习源于https://labuladong.gitee.io/algo/
代码框架对比
一般的二叉树的代码框架
public void leftFirst(TreeNode root) {
if (root == null) return;
//前序遍历的位置
leftFirst(root.left);
//中序遍历的位置
leftFirst(root.right);
//后序遍历的位置
}
这种情况即先对左子节点递归的情况。
这种情况在代码中的三个位置即二叉树中使用的前序遍历、中序遍历以及后序遍历的概念。在三处的输出顺序如下:
位置 | 输出顺序 |
---|---|
位置一 | 前序遍历:根节点——>左子节点——>右子节点 |
位置二 | 中序遍历:左子节点——>根节点——>右子节点 |
位置三 | 后序遍历:左子节点——>右子节点——>根节点 |
注意:无论在哪个位置,对节点的操作都是使用root。在中序位置时,用的root,其实就是左子节点。因为在前一句传入的是root.left
修改后的代码框架(先递归右子节点)
/**
* 先递归右子节点的
*/
public void rightFirst(TreeNode root) {
if (root == null) return;
//位置一
rightFirst(root.right);
//位置二
rightFirst(root.left);
//位置三
}
这种情况下是先对右子节点递归。
注意此时代码中的三个位置并不是二叉树中前序遍历、中序遍历以及后序遍历的概念,二者没有关系。
三个位置上对应的输出顺序如下:
位置 | 输出顺序 |
---|---|
位置一 | 输出顺序:根节点——>右子节点——>左子节点 |
位置二 | 输出顺序:右子节点——>根节点——>左子节点 |
位置三 | 输出顺序:右子节点——>左子节点——>根节点 |
**总结:**因为在二叉树的遍历定义中,以根节点的输出顺序定义的,而且左子节点永远在右子节点前。因此与先递归左子节点的代码框架的三个位置一一对应。
在先递归右子节点的,就是将左右子节点的位置调换一下。
使用场景对比
先递归左子节点的:按照三种遍历方式遍历二叉树;
先递归右子节点的:需要先知道右子树/右子节点的情况的(如leetcode 538题)
示例
定义如下二叉树:
则两种代码框架在三个位置的输出对比如下:
位置一:
位置二:
位置三:
测试完整代码参考仓库:https://gitee.com/raoqingmei2021/leetcodeComeon/blob/master/src/com/tree_/AcknowledgeBinaryTree.java