从数字序列构建一棵特殊的树
Contructing a special tree, from numerical sequence
我有一个有趣的任务,但我不知道如何解决它。
给定序列a=(a1,...,an)的无重复元素的最小二叉树M(a)定义如下: Be ai (a1,...,an)的最小个数),则M(a)的根为ai,其左子树为M(a1,...,ai-1),右子树为M(ai+1,...,an)。 M(∅) 是一棵空树。对于给定的序列,在 O(n) 中构造最小树。请注意,子树也是 M,因此它们必须遵循规则。
这里的例子。
感谢您的帮助。
它叫做笛卡尔树。关于在此处创建一个的文章:https://iq.opengenus.org/cartesian-tree/
C:\Users\James\code\minbin>minbin
1 -> 2
2 -> 3
3 -> 7
3 -> 5
5 -> 11
5 -> 8
8 -> 15
8 -> 19
1 -> 12
12 -> 13
您可以在 https://gist.github.com/JamesBremner/ac9ad8db15eafaad57a89532e64ff7bf
查看生成此输出的代码
算法是递归的:
- 找到最小的元素
- link parent 到最小
- 拆分剩余号码
- 如果左边是单个的,link 从最小的开始,否则再次调用 split
- 如果右边是单个的,link从最小的开始,否则再次调用split
- return
我有一个有趣的任务,但我不知道如何解决它。
给定序列a=(a1,...,an)的无重复元素的最小二叉树M(a)定义如下: Be ai (a1,...,an)的最小个数),则M(a)的根为ai,其左子树为M(a1,...,ai-1),右子树为M(ai+1,...,an)。 M(∅) 是一棵空树。对于给定的序列,在 O(n) 中构造最小树。请注意,子树也是 M,因此它们必须遵循规则。
它叫做笛卡尔树。关于在此处创建一个的文章:https://iq.opengenus.org/cartesian-tree/
C:\Users\James\code\minbin>minbin
1 -> 2
2 -> 3
3 -> 7
3 -> 5
5 -> 11
5 -> 8
8 -> 15
8 -> 19
1 -> 12
12 -> 13
您可以在 https://gist.github.com/JamesBremner/ac9ad8db15eafaad57a89532e64ff7bf
查看生成此输出的代码算法是递归的:
- 找到最小的元素
- link parent 到最小
- 拆分剩余号码
- 如果左边是单个的,link 从最小的开始,否则再次调用 split
- 如果右边是单个的,link从最小的开始,否则再次调用split
- return