在二元树中找出和为某一值的所有路径

来源:互联网 发布:linux sleep函数 编辑:程序博客网 时间:2024/04/29 20:32

问题描述:

输入一个整数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){//添加元素xif (IsFull())//cout << 'aaa';throw;elsestack[++top] = x;return *this;}template<class T>Stack<T>& Stack<T>::Pop(T& x){if (IsEmpty())//cout << 'aa';throw;elsex = 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");}





0 0