算法习题5:在二元树中找出和为某一值的所有路径

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

二元树节点的数据结构定义为:

struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node

};

还是二叉树,不多说 主要就是递归思想了。。

这里目标值我定死输入  target这个大家可以改成输入

大家可以更深入考虑下,是不是所有点都必须遍历呢???

我们这里要找的是从跟节点到叶子节点路径之和等于某给定值,所以当路上值已经大于时那么这条路径就没有必要继续走下去了,

所以这里可以加速下算法。


加上

if(sum > target)
    return;


//============================================================================
// Name        : IteratePath.cpp
// Author      : YLF
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

#define MAX 50

struct BinaryTreeNode{
	int value;
	BinaryTreeNode* left;
	BinaryTreeNode* right;
};

void addNode(BinaryTreeNode* & , int);
void search(BinaryTreeNode* p, int preSum, int* arr,int index);
void printBinaryTree(BinaryTreeNode* p);

int target = 27;

int main() {
	BinaryTreeNode* head = NULL;
	int input = 0;
	int num = 0;
	cin>>num;

	int i=0;
	for(i=0; i<num; i++){
		cin>>input;
		addNode(head, input);
	}
	int arr[MAX];
	search(head, 0, arr, 0);
	printBinaryTree(head);
	return 0;
}

void addNode(BinaryTreeNode* &p, int value){
	

	if(p == NULL){
		
		BinaryTreeNode* temp = new BinaryTreeNode();
		temp->value = value;
		temp->left = NULL;
		temp->right = NULL;
 		p = temp;
	}else{
		if(value < p->value){
			addNode(p->left, value);
		}else
			addNode(p->right, value);
	}
}

void search(BinaryTreeNode* p, int preSum, int* arr,int index){
	int sum = 0;
	sum = preSum + p->value;
	arr[index++] = p->value;
	if(p->left == NULL && p->right == NULL){
		if(sum == target){
			int i=0;
			cout<<"path:";
			for(i=0;i<index;i++){
				cout<<arr[i]<<"-->";
			}
			cout<<endl;
		}
	return;
	}
	if(p->left != NULL){
		search(p->left, sum, arr, index);
	}
	if(p->right != NULL){
		search(p->right, sum, arr, index);
	}
}

void printBinaryTree(BinaryTreeNode* p){	
	if(p == NULL)
		return;
	printBinaryTree(p->left);
	cout<<p->value<<" ";
	printBinaryTree(p->right);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值