在二元树中找出和为
某一值的所有路径
输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数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
输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数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);
}