java - 二叉树的递归代码流程

标签 java recursion tree binary-tree

我试图逐步理解这个递归程序,了解每次调用该函数时会发生什么,但想确定我认为的代码流是否正确。

    public static int checkHeight(TreeNode root) {
        if (root == null) {
            return 0; // Height of 0
        }

        /* Check if left is balanced. */
        int leftHeight = checkHeight(root.left);
        if (leftHeight == -1) {
            return -1; // Not balanced
        }
        /* Check if right is balanced. */
        int rightHeight = checkHeight(root.right);
        if (rightHeight == -1) {
            return -1; // Not balanced
        }

        /* Check if current node is balanced. */
        int heightDiff = leftHeight - rightHeight;
        if (Math.abs(heightDiff) > 1) {
            return -1; // Not balanced
        } else {
            /* Return height */
            return Math.max(leftHeightJ rightHeight) + 1;
        }
    }
    public static boolean isBalanced(TreeNode root)
    {
        if (checkHeight(root) == -1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

示例:

           1
        /     \
       2       3
    /    \   /
   4      5  6
 /
7

当程序运行并到达 checkHeight(root.left) 行时,它现在的元素为 2(root.left),因此会递归调用该函数,并且堆栈会暂停执行,如下所示

|checkHeight(2)| 

然后直到到达最左边元素的末尾为止

|checkHeight(7)|
|checkHeight(4)|
|checkHeight(2)|

|检查高度(7)|弹出时 leftHeight = 0 rightHeight = 0。

运行时 |checkHeight(4)| -> 左高度=1,右高度=0

|检查高度(2)| -> leftHeight = 2, rightHeight=1(因为它运行 |checkHeight(5)|)

一旦完成,它会返回:Max(2,1)+1 = 3,这将是 leftHeight 的值。

我的理解正确吗?希望我没有混淆这些步骤。提前致谢

最佳答案

既然你没有问一个可以用代码来回答的具体问题,我可以这样说:

递归的关键不是跟随每一次调用并坚持调用迷宫,而是阅读代码(对于递归调用)并相信递归调用应该做什么,它应该做什么。最好确保单次调用它正在执行的操作的正确性。然后你可以直接跳过所有“相似”的调用直到最后(比如这里的7)

另一件事是基本规则,方法返回必须有一个条件 - 基本情况(防止无限循环)

考虑到这两个事实,我认为您的步骤是正确的(我确实遵循了调用。)

提示:您始终可以在调试中使用断点来检查整个过程,而不是手动检查。毕竟,这就是调试的目的。

关于java - 二叉树的递归代码流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31107700/

相关文章:

java - 使用尾递归的双向链表

java - 为 Azure 存储访问生成 SAS

recursion - 从 Julia AST 中剥离行号

java - 如何在 Vaadin 中实现延迟加载树?

javascript - 在 Javascript Canvas 中动画分形树

javascript - 如何从 Firefox Addon XUL 树中添加和删除行

java - Android 多播只能使用 255.255.255.255 地址

java - 用相机拍照但不保存为文件,仅显示

python - Scala:递归修改元素/列表的列表

java - 在java中将递归帕斯卡三角形居中?