您的位置:首页 > 其它

【二叉树】打印二叉树中结点数值总和等于某个给定值的所有路径

2018-01-04 21:29 573 查看

问题

给定一棵二叉树,其中每个结点都含有一个数值。设计一个算法,打印结点数值总和等于某个给定值的所有路径。注意:路径不一定非得从二叉树的根结点或叶节点开始或结束。

思路

采用二次遍历的方式。

1. 在函数func1中,先从根结点开始遍历二叉树,到达当前结点current。

2. 将current传入func2中,遍历current子树,打印二叉树中数值总和等于给定值的路径。

两种实现方式

递归和迭代

这里对子树和二叉树采用相同的遍历方式,并分别采用递归和迭代两种方式来实现遍历。当然,也可以对子树采用与原二叉树不同的遍历方式,即交叉使用递归和迭代方式。

递归实现代码

/********************************************
*  Author        : Dong Huaan
*  Email         : donghuaan@163.com
*  Filename      : PathMatchPathInBinaryTree.cpp
*  Creation time : 2018-01-04 18:01:36
*  Last modified : 2018-01-04 20:50:37
*  Description   : ---
*******************************************/

// TOC: rand situation: O(nlog(n))
// SOC: rand situation: O(log(n))

#include<iostream>
#include<list>
#include"BinaryTree.h"

// 打印链表
void printList(const std::list<int> &path)
{
if(!path.empty())
{
for(std::list<int>::const_iterator iter = path.begin(); iter != path.end(); ++iter)
std::cout << *iter << "  ";
std::cout << "\n";
}
}

// 前序遍历子树
// 通过引用来实现路径存储和数值和的传递
void printMatchedPathHelper(BTNode *root, std::list<int> &path, int &sum, const int k)
{
if(!root) return;

path.push_back(root->data);
sum += path.back();

if(sum == k) printList(path);

if(root->left)
{
printMatchedPathHelper(root->left, path, sum, k);
sum -= path.back();
path.pop_back();
}
if(root->right)
{
printMatchedPathHelper(root->right, path, sum, k);
sum -= path.back();
path.pop_back();
}
}

// 遍历子树的接口函数
void printMatchedPathHelper(BTNode *root, const int k)
{
std::list<int> path;
int sum = 0;
printMatchedPathHelper(root, path, sum, k);
}

//前序遍历原二叉树
void printMatchedPath(BTNode *root, const int k)
{
if(!root) return;

printMatchedPathHelper(root, k);

printMatchedPath(root->left, k);
printMatchedPath(root->right, k);
}

//**********test code**********
void test()
{
BTNode *root = nullptr;

createBinaryTree(root);
std::cout << "pre order traverse:\n";
preOrdertraverseBinaryTree_Recur(root);

const int k = 5;

std::cout << "\n\nresult:\n";
printMatchedPath(root, k);
}

int main()
{
test();
}


迭代实现代码

/********************************************
*  Author        : Dong Huaan
*  Email         : donghuaan@163.com
*  Filename      : PathMatchPathInBinaryTree_Iter.cpp
*  Creation time : 2018-01-04 19:01:58
*  Last modified : 2018-01-04 20:49:19
*  Description   : ---
*******************************************/

// TOC: rand situation: O(nlog(n))
// SOC: rand situation: O(log(n))

#include<iostream>
#include<stack>
#include<list>
#include"BinaryTree.h"

// 打印链表
void print(const std::list<int> &path)
{
if(!path.empty())
{
for(std::list<int>::const_iterator iter = path.begin(); iter != path.end(); ++iter)
std::cout << *iter << "  ";
std::cout << "\n";
}
}

// 中序遍历子树
void printMatchedPathHelper(BTNode *root, const int k)
{
std::stack<BTNode*> stack;
BTNode *temp = root;

std::list<int> path;
int sum = 0;

while(temp || !stack.empty())
{
while(temp)
{
stack.push(temp);
path.push_back(temp->data);
sum += temp->data;

if(sum == k) print(path);

temp = temp->left;
}

if(!stack.empty())
{
temp = stack.top();
stack.pop();

temp = temp->right;

if(!temp)
{
sum -= path.back();
path.pop_back();
}
}
}
}

// 前序遍历原二叉树
void printMatchedPath(BTNode *root, const int k)
{
if(!root) return;

std::stack<BTNode*> stack;
BTNode *temp = root;
stack.push(temp);

while(!stack.empty())
{
temp = stack.top();
printMatchedPathHelper(temp, k);
stack.pop();

if(temp->right) stack.push(temp->right);
if(temp->left) stack.push(temp->left);
}
}

//**********test code**********
void test()
{
BTNode *root = nullptr;
const int k = 5;

createBinaryTree(root);
std::cout << "pre order traverse:\n";
preOrdertraverseBinaryTree_Recur(root);

std::cout << "\n\nresult:\n";
printMatchedPath(root, k);
}

int main()
{
test();
}


测试

功能测试:进行了少量功能测试。未进行大量用例的功能测试。

边界值测试:未进行边界值测试。

特殊输入测试:未进行特殊输入测试。

递归实现测试



迭代实现测试

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐