二叉树路径的查找(和为某一值)

二叉树路径的寻找,即为二叉树的遍历.

二叉树遍历过程的实现步骤:

(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等集合类


代码中所定义的二叉树为:

二叉树路径的查找(和为某一值)_第1张图片

本代码的执行结果:

A:1 C:3 F:6


你可能感兴趣的:(算法解析)