二叉树路径的寻找,即为二叉树的遍历.
二叉树遍历过程的实现步骤:
(1)若二叉树为空,则遍历结束
(2)若二叉树不为空,则开始遍历二叉树,遍历二叉树的顺序有一下六种方式:
① DLR 先访问根,再遍历左子树,然后遍历右子树(先序遍历)
② DRL先访问根,再遍历右子树,然后遍历左子树(先序遍历)
③ LDR先遍历左子树,再访问根,然后遍历右子树(中序遍历)
④ LRD先遍历左子树,再遍历右子树,然后访问根(后序遍历)
⑤ RLD先遍历右子树,再遍历左子树,然后访问根(后序遍历)
⑥ RDL先遍历右子树,再访问根,然后遍历右子树(中序遍历)
根据不同的遍历方法,可以编写不同二叉树的遍历算法,一般采用的是先序遍历(递归函数实现)。
java实现树节点的定义:
class Node{
char title;//树节点的标志符
int value;//树节点的数据域
Node left;//树的左孩子
Node right;//树的右孩子
public Node(char title , int value , Node left , Node right){
this.title = title;
this.value = value;
this.left = left;
this.right = right;
}
}
java实现寻找相应路径(和为某一值)的实现:
public class TreeFindPath {
public void FindPath(Node root,int x){
if( root == null){
return;
}
List list = new ArrayList();
int sum = 0;
FindPath(root, list, sum, x);
}
private void FindPath(Node root, List list, int sum, int x){
//根节点放入list
sum += root.value;
list.add(root);
//输出list结果
if( sum == x && root.left == null && root.right == null){
for(int i = 0; i < list.size(); i++){
System.out.print( " "+list.get(i).title+":"+list.get(i).value+" ");
}
System.out.println();
}
//遍历左子树
if(root.left!=null){
FindPath(root.left, list, sum, x);
}
//遍历右子树
if(root.right!=null){
FindPath(root.right, list, sum, x);
}
sum -= root.value;
list.remove(root);
}
public static void main(String []args){
Node d = new Node('D', 4, null, null);
Node e = new Node('E', 5, null, null);
Node f = new Node('F', 6, null, null);
Node g = new Node('G', 7, null, null);
Node b = new Node('B', 2, d, e);
Node c = new Node('C', 3, f, g);
Node a = new Node('A', 1, b, c);
new TreeFindPath().FindPath(a, 10);//定义查找的和为10的路径
}
}
注:
针对本问题,本例采用的先序遍历的方式存入List
针对不同的问题,采用不同的遍历方式,以及相应的集合类。例如也可以使用HashSet,LinkList等集合类
本代码的执行结果:
A:1 C:3 F:6