在二元树中找出和为某一值的所有路径
2014-10-03 02:41
423 查看
问题描述:
输入一个整数k和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10,12和10, 5,7。
算法:
①构造二叉树,这里只定义了一个简易的节点struct:BinaryTreeNode,二叉树的完整定义后续会再发文。。②前序遍历,叠加路径上每个节点的data值,若等于k,则输出路径
值得注意的是,需要一个栈来记录走过的路径,这个栈的定义中,需要扩充一个方法Output(),用来自栈底输出所有元素
代码实现:
扩充的堆栈Stack.h考虑到通用编程,采用模板
#pragma once #include<iostream> using namespace std; template<class T> class Stack{ public: Stack(int MaxStackSize = 10); ~Stack(){ delete[]stack; } bool IsEmpty()const{ return top == -1; } bool IsFull()const{ return top == MaxTop; } T Top()const; Stack<T>&Push(const T&x); Stack<T>&Pop(T&x); void Output()const; private: int top; int MaxTop; T*stack; }; template<class T> Stack<T>::Stack(int MaxStackSize){ //Stack类构造函数 MaxTop = MaxStackSize - 1; stack = new T[MaxStackSize]; top = -1; } template<class T> T Stack<T>::Top()const{ //返回栈顶元素 if (IsEmpty())cout << 'aaa';//throw OutOfBounds(); return stack[top]; } template<class T> Stack<T>& Stack<T>::Push(const T& x){ //添加元素x if (IsFull()) //cout << 'aaa'; throw; else stack[++top] = x; return *this; } template<class T> Stack<T>& Stack<T>::Pop(T& x) { if (IsEmpty()) //cout << 'aa'; throw; else x = stack[top--]; return *this; } template<class T> void Stack<T>::Output()const { for (int i = 0; i <=top; i++) cout << stack[i] << ' ' ; }
main.cpp
#pragma once #include<iostream> #include"Stack.h" using namespace std; struct BinaryTreeNode { int data; BinaryTreeNode* left; BinaryTreeNode* right; }; //查找和为k的路径 void PreFind(BinaryTreeNode* t,int& sum,Stack<int>& stack,int k) { if (t) { sum += t->data; stack.Push(t->data); if (sum == k) { stack.Output(); cout << endl; } PreFind(t -> left,sum,stack,k); PreFind(t->right, sum, stack, k); stack.Pop(t->data); sum -= t->data; } } void main() { BinaryTreeNode* t4 = new BinaryTreeNode; BinaryTreeNode* t7 = new BinaryTreeNode; BinaryTreeNode* t5 = new BinaryTreeNode; BinaryTreeNode* t12 = new BinaryTreeNode; BinaryTreeNode* t10 = new BinaryTreeNode; //构造二叉树 t4->data = 4; t7->data = 7; t5->data = 5; t12->data = 12; t10->data = 10; t4->left = t4->right = NULL; t7->left = t7->right = NULL; t12->left = t12->right = NULL; t5->left = t4; t5->right = t7; t10->left = t5; t10->right = t12; Stack<int> stack; int k; cin >> k; int sum=0; PreFind(t10, sum, stack, k); system("pause"); }
相关文章推荐
- (转)在二元树中找出和为某一值的所有路径,java版本
- 算法与数据结构面试题(4)-在二元树中找出和为某一值的所有路径
- [编程之美-03]在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- No4、在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径
- .在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 练习系列 - 6、在二元树中找出和为某一值的所有路径
- Java实现:在二元树中找出和为某一值的所有路径
- 二元树中找出何为某一值的所有路径 【微软面试100题 第四题】
- 微软编程题之在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值 的所有路径
- No.4 在二元树中找出和为某一值的所有路径
- 100题_04 在二元树中找出和为某一值的所有路径
- 4.在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径