在二元树中找出和为某一值的所有路径

题目:

 

题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
  10  
  / \  
  5 12  
  / \  
  4 7

则打印出两条路径:10, 12和10, 5, 7。

思路:有两种方法,递归和非递归。其中非递归使用前序遍历,一条路走到底,并且每次访问一个节点,就判断当前访问的节点是否符合要求,符合就进栈保持,不然就退栈,对退出来的节点判断是否有右子树,有就继续往下,否则就继续退栈。

代码:

 

递归:

public void findPath(BiSearchTree node,int sum, String path){
		sum  = sum - node.data;
		if(sum<0){
			return;
		}else if(sum==0){
			path = path + " " + node.data;
			System.out.println("Path: "+path);
		}else{
			if(node.LeftTree!=null){
				findPath(node.LeftTree, sum , path + " " + node.data);
			}
			if(node.RightTree!=null){
				findPath(node.RightTree, sum,path + " " + node.data);
			}
		}
		
	}
	

 

 

非递归:

 

public void findPath(BiSearchTree node,int sum){
		BiSearchTree pre = null;
		Stack stack = new Stack();
		do{
			while(node!=null){
				
				sum = sum - node.data;
				if(sum<0){
					break;
				}else if(sum==0){
					pre = node;
					sum = sum + node.data;
					System.out.println("I find "+node.data);
				}else{
					stack.push(node);
				}
				if(node.LeftTree!=null)
					pre = node;
				node = node.LeftTree;
			}
			node = (BiSearchTree)stack.pop();
			if(node.RightTree==null||node.RightTree==pre){
				pre = node;
				sum = sum + node.data;
				node = null;
			}else {
				stack.push(node);
				pre = node;
				node = node.RightTree;
			}
		}while(!stack.IsEmpty());
	}

 

非递归打印出来的只是符合要求的最后一个节点。

可以打印出栈的全部元素。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值