【发布时间】:2016-07-20 08:12:05
【问题描述】:
我的班级一直致力于使用递归来创建诸如河内塔、斐波那契以及所有有趣的东西之类的东西。问题是,我并不是很了解所有内容。我了解递归的一般概念,但是在编写程序时将其付诸实践对我来说感觉很复杂。我知道它会一遍又一遍地调用该方法,通常在它到达它退出的基本情况下,但我很难编写代码来完成我想要它做的事情。
我们现在正在研究二叉树。我们应该使用我的教授提供的一些代码来拆分一棵树,然后编写一个递归方法来打印出树包含的所有路径。我们的输入将类似于(a(b()())(c()())),这将是一棵树:
a
b c
b 和 c 将在其下方有 0 个子级。 (a) 是一个可能的节点,() 将是一个空节点,它将是该路径的结束。我们的目标是打印出所有路径,因此对于我的示例,输出将是:
a b
a c
我们得到的代码包括一个帮助方法,我们可以用它来编写我们的递归方法:
public class BinaryTree {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String tree = scan.nextLine();//correct format : (a()())
String[] t = splitTree(tree);
System.out.println(Arrays.toString(t));
}
public static String[] splitTree(String tree)
{
//expected format
//(node tree tree)
//0 1 2-x x-(length-2) length-1
if(tree.length() <= 2)//tree not long enough to process
return new String[]{tree};
String[] temp = new String[3];
temp[0] = "" + tree.charAt(1);//grab tree node
tree = tree.substring(2, tree.length()-1);//remove node and outer paren
int parenCount = 0;//count of open paren
int endTreeOne = 0;//end of first tree
for(int i = 0; i < tree.length(); i++)
{
if(tree.charAt(i) == '(')
parenCount++;
if(tree.charAt(i) == ')')
parenCount--;
if(parenCount == 0)
{
endTreeOne = i;
break;//ends for loop early
}
}
temp[1] = tree.substring(0, endTreeOne+1);//left tree
temp[2] = tree.substring(endTreeOne+1);//right tree
return temp;
}
这个方法基本上是把(a(b()())(c()()))这样的字符串转换成[a, (b()()), (c()())]。基本上将树拆分。
我真的不确定如何从这里开始编写我的递归方法。老实说,我感到非常迷茫(因此感到沮丧)。我想我需要让我的方法检查“()”是否存在,那就是路径的尽头。这会是我退出我需要的循环的基本情况吗?我不确定如何指定树的哪一侧。如果有人可以提供任何帮助、提示或让我找到解决此问题的正确思路,我将不胜感激。
【问题讨论】:
-
通常树会与面向对象编程一起教授...如果树有
BinaryTree left和BinaryTree right变量,这将非常容易,因为您只需打印根,然后递归打印左树,然后递归打印右树。 -
@cricket_007,正确的想法,但 OP 并没有要求树的打印表示。相反,对于每个叶子,打印从根到叶子的路径。该程序可以按照您描述的查找叶子的相同方式遍历树,但是当它打印时,以及沿途要记住的内容有些不同。
-
对,我应该打印从根到每个分支末尾的路径。我只是对如何开始这件事感到有点迷茫。 :(
-
我有可以解析字符串的代码。这对您来说足够了吗,因为您的问题主要是两个部分?
-
它是如何解析字符串的?我可以看看吗?
标签: java recursion tree binary-tree