java - 递归打印所有路径的树遍历的复杂性
问题描述
如果给出输入,我编写了一个程序来查找所有有效的参数组合N
。应该有N
多个参数。例如,如果N = 2
,答案将是()(), (())
,如果N = 3
答案将是((())), (())(), ()(()), ()()(), (()())
。
我已经在 Java 中使用二叉树实现了该解决方案。这是我的解决方案。
class Node {
char value;
Node right;
Node left;
public Node(char value) {
this.value = value;
}
public void insertRight(char value) {
Node node = new Node(value);
this.right = node;
}
public void insertLeft(char value) {
Node node = new Node(value);
this.left = node;
}
}
public class App
{
private static final int N = 3;
public static void main (String[] args)
{
Node tree = new Node('(');
insertNodes(tree, N - 1, 1);
printParams("", tree);
}
private static void insertNodes(Node currentNode, int remainingOpen, int remainingClose) {
if (remainingOpen > 0) {
currentNode.insertLeft('(');
insertNodes(currentNode.left, remainingOpen - 1, remainingClose + 1);
}
if (remainingClose > 0) {
currentNode.insertRight(')');
insertNodes(currentNode.right, remainingOpen, remainingClose - 1);
}
}
private static void printParams(String paramStr, Node node) {
paramStr = paramStr + node.value;
if (node.left == null && node.right == null) {
System.out.println(paramStr);
return;
}
if (node.left != null)
printParams(paramStr, node.left);
if (node.right != null)
printParams(paramStr, node.right);
}
}
我想知道这个解决方案的复杂性。创建树的复杂性是多少,遍历每条路径的复杂性是多少?
我知道,2 * N
每条路径中都会有节点,并且最多会有2^2N
孩子。如果我们从根开始遍历每条路径,复杂度可能是N * 2 ^ 2N
. 但是,当涉及递归时,我无法考虑复杂性。
解决方案
创建的复杂性由您创建的节点数量给出,这足够直观。遍历是相同的,因为您只访问每个节点一次。
在您的情况下,节点数形成一个加泰罗尼亚语序列:https://en.wikipedia.org/wiki/Catalan_number 。
推荐阅读
- mysql - laravel6 无法提交表单
- python - 如何从python调用节点函数,反之亦然
- javascript - 如何在 nuxt 插件中访问全局 mixin?
- hyperledger-fabric - 无法调用链码
- html - 有没有办法改变 django/html 中的日期格式?
- python - pyparsing如何访问解析结果中的重复模式
- mapserver - TileCache 和 MapServer 图层类型 - 如何指定 MapServer URL?
- reactjs - 如何在反应中用数组中的数据库数据替换硬编码值
- sql - 用 cosmos 在字典对象内部查询?
- asp.net-core - ASP Net Core 在 UseSpa 中间件中应用中间件