像许多新手一样,我的头因递归而爆炸。我查找了很多关于 SO 的答案/解释。但我仍然不清楚这个概念。(这不是家庭作业,我正在尝试重新学习我没有学过的东西,递归从来都不是字符串点)
给定一个前序遍历,构造一棵二叉树。使用递归,它必须看起来很简单:) 但我就是不明白。
我看到arr 的顺序必须按照插入节点的顺序。让我烦恼的是:
- 如果节点已经有左/右怎么办?这是如何运作的?
递归如何插入节点,例如以下预购?
12, 10, 6, 13
15 是根,5、3 和左
如何正确插入 6 作为 10 的左孩子?
12
10 13
6*
这是骨架代码:
main()
{
int[] arr = {};
//make the first node a root node.
node n = new node(arr[0]);
buildbst(n, arr, 0)
}
buildbst(node root, int[] arr, int i)
{
if (i == arr.length) return;
if (arr[i] < root.data)
root.left = new node (arr[i]);
else
root.right = new node(arr[i]);
buildbst(root.left, arr, i++);
buildbst(root.right, arr, i++);
}
编辑:
我刚刚意识到,如果我传入递归调用buildbst(root.left, arr+i, i++)
是正确的方法吗?或者我是不是把这一切都搞错了——动态编程和递归以及分而治之的混搭......