我有以下简单的树:
我的目标是找到两个管理器节点之间的路径。
将在cmd中选择两个节点输入。
因此用户可以输入' java BinaryTree manager1 manager2'输出将显示到达第二个管理器所需的路径。此示例应输出以下内容:
' Manager1>老板< Manager2'
我到目前为止的代码定义了节点但是我需要一个findPath方法来打印路径。
代码:`
public class BinaryTree
{
public static void main(String[] args)
{
Node boss = new Node(1);
Node manager1 = new Node(2);
Node manager2 = new Node(3);
boss.left = manager1;
boss.right = manager2;
String path = findPath(args[0], args[1]);
System.out.println(path);
}
static class Node
{
Node left;
Node right;
int value;
public Node(int value)
{
this.value = value;
}
}
}`
感谢您的帮助:)
答案 0 :(得分:3)
在最一般意义上,您必须找到从根到每个节点的路径,并将它们合并在一起。
如何找到路径取决于树的排列;在最坏的情况下,它需要完全遍历树。
在合并步骤中,修剪两条路径中的所有常见祖先,但跟踪最近的共同祖先。您想要的路径与经理1的路径左侧相反,然后是最近的共同祖先(" Boss"在图中),然后是经理2的路径。
确保容纳一个管理器是另一个管理器的祖先的情况(我描述的合并过程仍然有效,但其中一个修剪路径将为空)。还要确保陷阱或容纳管理员1 ==经理2的情况。
如果您的树具有超出简单树拓扑结构的结构,则可以优化上述某些结构,尤其是路径查找。
答案 1 :(得分:0)
这是打印2个节点之间路径的程序。
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PrintPath {
static List<Node> path = new ArrayList<Node>();
static boolean foundBoth;
/**
* @param args
*/
public static void main(String[] args) {
Node root = Node.createTree();
printPath(root,9,11);
System.out.println(path);
}
static boolean printPath(Node root,int val1 ,int val2){
if(root==null){
return false;
}
if(root.data == val1 || root.data == val2){
addToPath(root);
if(!foundBoth)
foundBoth = findDown(root,(root.data==val1)?val2:val1);
return true;
}
if(!foundBoth){
boolean left = printPath(root.getLeft(), val1, val2);
if(left){
addToPath(root);
}
boolean right = printPath(root.getRight(), val1, val2);
if(right)
addToPath(root);
return (left|| right);
}else{
return true;
}
}
private static void addToPath(Node root) {
path.add(root);
}
static boolean findDown(Node root,int val2){
if(root == null){
return false;
}
if(root.data == val2){
addToPath(root);
return true;
}
boolean left = findDown(root.getLeft(), val2);
if(left){
addToPath(root);
return true;
}
boolean right = findDown(root.getRight(), val2);
if(right){
addToPath(root);
return true;
}
return false;
}
}