我试图找出如何获取从二进制树上的根到给定节点的路径.
它不是二叉搜索树.
每个非叶子节点只有两个指向其子节点的指针.
按顺序,预订,后订单遍历不起作用.
我曾尝试做预购,但无法弄清楚如何.例如,我们有一个二叉树:它不是二叉搜索树.我们使用排序顺序节点来更容易地找到路径.
1
/ \
2 3
/ \ / \
4 5 6 7
Run Code Online (Sandbox Code Playgroud)
我们想要找到1到7的路径:
通过预购,我们有:
1 -> 2 -> 4 -> 5 -> 3 -> 6 -> 7
Run Code Online (Sandbox Code Playgroud)
从流程中,我们得到路径从1 - > 7,其上包含所有节点.
显然,它不应该.
任何帮助都非常感谢.
Ray*_*oal 27
预订遍历,也称为深度优先搜索确实有效.
如果以递归方式实现preorder遍历,那么当到达所需节点时,可以展开堆栈(递归调用)并反向构建路径.
如果您以非递归方式实现前序遍历,那么您将直接构建一个堆栈,因此在这种情况下,一旦到达所需的节点,您就已经拥有了路径.
在上面问题的树中,查找从1到7的路径的算法如下所示.
小智 6
您将获得一个二叉树(根节点)..并且会给出一个键,该键可能在树中,也可能不在树中.您必须找到从根到节点的完整路径.
例:
A
/ \
B C
\ /
D E
/ \ \
K L M
/
Z
Run Code Online (Sandbox Code Playgroud)
你给了节点Z(或节点的密钥)和给定的节点A(根)所以你的输出应该是
ABDKZ
如果给出M,则输出应为ACEM
public class main_class {
public static void main(String args[] ) {
//first create tree
Node rootNode = new Node ('A' , new Node('B',null,
new Node('D',
new Node('K',
new Node('Z',null,
null),null),
new Node('L',null,null))),
new Node('C',
new Node('E',
null,
new Node('M',null,null)),null) );
ArrayList <Node> path = new ArrayList<Node>();
System.out.println(getPath(rootNode,'Z',path));
System.out.println(path);
path = new ArrayList<Node>();
System.out.println(getPath(rootNode,'M',path));
System.out.println(path);
}
static boolean getPath(Node rootNode, char key, ArrayList<Node> path ){
//return true if the node is found
if( rootNode==null)
return false;
if (rootNode.getVal()==key){
path.add(rootNode);
return true;
}
boolean left_check = getPath( rootNode.left,key,path);
boolean right_check = getPath( rootNode.right,key,path);
if ( left_check || right_check){
path.add(rootNode);
return true;
}
return false;
}
static class Node {
char val;
Node left;
Node right;
public Node( char val, Node left, Node right){
this.left=left;
this.right=right;
this.val=val;
}
public char getVal(){
return val;
}
public String toString(){
return " " + val + " ";
}
}
}
Run Code Online (Sandbox Code Playgroud)