Я часто нахожу, что некоторые правильно расположенные операторы печати могут быть чрезвычайно полезны для понимания последовательности алгоритма, особенно когда он включает в себя рекурсию.Я обновил ваш код, чтобы вывести, какой дочерний элемент, L
или R
, обрабатывается и уровень через строку отступа.
public TreeNode constructMaximumBinaryTree(int[] nums) {
return helper(nums, 0, nums.length-1, "", "");
}
public TreeNode helper(int[] nums, int low, int high, String side, String ind){
if (high < low){ return null; }
System.out.println(ind + side + Arrays.toString(Arrays.copyOfRange(nums, low, high+1)));
//find max element's index
int maxIndex = getMaxIndex(nums, low, high);
//construct root node
TreeNode root = new TreeNode(nums[maxIndex]);
//generate left subtree from the left part of subarray
root.left = helper(nums, low, maxIndex-1, "L", ind + " ");
//generate right sub tree from the right part of subarray
root.right = helper(nums, maxIndex+1, high, "R", ind + " ");
return root;
}
На вашем входе это дает:
[3, 2, 1, 6, 0, 5]
L[3, 2, 1]
R[2, 1]
R[1]
R[0, 5]
L[0]
Что, я думаю, делает построение дерева намного более ясным.