【二叉树】打印二叉树中结点数值总和等于某个给定值的所有路径
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(); }
测试
功能测试:进行了少量功能测试。未进行大量用例的功能测试。边界值测试:未进行边界值测试。
特殊输入测试:未进行特殊输入测试。
递归实现测试
迭代实现测试
相关文章推荐
- 程序员面试金典: 9.4树与图 4.9在二叉树中,打印结点数值总和等于给定值的所有路径
- 打印二叉树节点数值总和等于某个给定节点的所有路径
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 节点数值总和等于某个给定值的所有路径
- 【31】给定一个二叉树打印出所有从根结点到叶子结点路径和为 k 的路径
- 【31】给定一个二叉树打印出所有从根结点到叶子结点路径和为 k 的路径
- 给定一棵二叉树,和一个数值。求二叉树的路径和等于给定值的所有路径
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 剑指offer 打印出二叉树中结点值的和为输入整数的所有路径。
- 二叉树的路径和为给定数值的所有路径
- 【二叉树的递归】04找出二叉树中路径和等于给定值的所有路径【Path Sum II】
- 给定一棵二叉树,二叉树每个节点的值唯一,从根节点开始找出路径上的所有节点的节点值之和等于规定值的路径
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
- 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的结点形成一条路径。
- 打印二叉树根结点到所有叶子结点的路径
- 剑指offer_输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
- 【算法-java】打印出二叉树中结点值的和为输入整数的所有路径
- java实现输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
- 《剑指Offer》面试题:打印出二叉树中结点值的和为输入整数的所有路径