在二元树中找出和为某一值的所有路径
来源:互联网 发布: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
- 在二元树中找出和为某一值的所有路径的个人代码
- 在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径(树)
- No4、在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径-递归算法
- 在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 算法讨论(三)---在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- 算法题23 在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径
- Java this
- Java 参数传递
- windows+Ubuntu双系统 windows引导修复
- Qt核心剖析: moc
- xCheckRDCostInter
- 在二元树中找出和为某一值的所有路径
- xcompressCU
- 只需从中选出V型在哪吃爸妈那这些
- 更丰富大哥电饭锅电饭锅地方
- 法国大使馆史蒂夫史蒂夫史蒂夫
- 【Android开发日记】初次探秘Android Service!Service开机启动+重力感应+弹窗+保持运行
- Leetcode: LRU Cache
- V刹不错vbc
- php练手代码之微型论坛设计(3)