careercup-树与图 4.9

时间:2023-02-02 17:36:38

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

类似于leetcode:Path Sum II

C++实现代码:(使用了双重的递归)对于不含有parent指针域时。

#include<iostream>
#include<new>
#include<vector>
using namespace std; //Definition for binary tree
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}; class Solution
{
public:
vector<vector<int> > path;
vector<vector<int> > pathSum(TreeNode *root, int sum)
{
vector<int> tmp;
hasPathSum(root,sum,tmp);
//改变开始的节点,不一定要从根结点开始,遍历从每一个节点开始
if(root->left)
pathSum(root->left,sum);
if(root->right)
pathSum(root->right,sum);
return path;
}
void hasPathSum(TreeNode *root, int sum,vector<int> tmp)
{
if(root==NULL)
return;
tmp.push_back(root->val);
//改变结束的地方,不一定要到叶子节点
if((sum-root->val)==)
{
path.push_back(tmp);
}
if(root->left)
hasPathSum(root->left,sum-root->val,tmp);
if(root->right)
hasPathSum(root->right,sum-root->val,tmp);
}
void createTree(TreeNode *&root)
{
int i;
cin>>i;
if(i!=)
{
root=new TreeNode(i);
if(root==NULL)
return;
createTree(root->left);
createTree(root->right);
}
}
};
int main()
{
Solution s;
TreeNode *root;
s.createTree(root);
vector<vector<int> > path=s.pathSum(root,);
for(auto a:path)
{
for(auto v:a)
cout<<v<<" ";
cout<<endl;
}
}

方法二:如果结点中包含指向父亲结点的指针,那么,只需要去遍历这棵二叉树, 然后从每个结点开始,不断地去累加上它父亲结点的值直到父亲结点为空(这个具有唯一性, 因为每个结点都只有一个父亲结点。也正因为这个唯一性, 可以不另外开额外的空间来保存路径),如果等于给定的值sum,则打印输出。

实现的方法:

void find_sum(Node* head, int sum){
if(head == NULL) return;
Node *no = head;
int tmp = ;
for(int i=; no!=NULL; ++i){
tmp += no->key;
if(tmp == sum)
print(head, i);
no = no->parent;
}
find_sum(head->lchild, sum);
find_sum(head->rchild, sum);
}

打印输出时,只需要提供当前结点的指针,及累加的层数即可。然后从当前结点开始, 不断保存其父亲结点的值(包含当前结点)直到达到累加层数,然后逆序输出即可。

代码如下:

void print(Node* head, int level){
vector<int> v;
for(int i=; i<level; ++i){
v.push_back(head->key);
head = head->parent;
}
while(!v.empty()){
cout<<v.back()<<" ";
v.pop_back();
}
cout<<endl;
}

方法三:如果结点中不包含指向父亲结点的指针,则在二叉树从上向下查找路径的过程中, 需要为每一次的路径保存中间结果,累加求和仍然是从下至上的,对应到保存路径的数组, 即是从数组的后面开始累加的,这样能保证遍历到每一条路径。

代码如下:

void print2(vector<int> v, int level){
for(int i=level; i<v.size(); ++i)
cout<<v.at(i)<<" ";
cout<<endl;
}
void find_sum2(Node* head, int sum, vector<int> v, int level){
if(head == NULL) return;
v.push_back(head->key);
int tmp = ;
for(int i=level; i>-; --i){
tmp += v.at(i);
if(tmp == sum)
print2(v, i);
}
vector<int> v1(v), v2(v);
find_sum2(head->lchild, sum, v1, level+);
find_sum2(head->rchild, sum, v2, level+);
}

方法二 完整代码:

#include<iostream>
#include<new>
#include<map>
#include<vector>
using namespace std; struct BinarySearchTree
{
int elem;
BinarySearchTree *parent;
BinarySearchTree *left;
BinarySearchTree *right;
BinarySearchTree(int x):elem(x),parent(NULL),left(NULL),right(NULL) {}
}; void insert(BinarySearchTree *&root,int z)
{
BinarySearchTree *y=new BinarySearchTree(z);
if(root==NULL)
{
root=y;
return;
}
else if(root->left==NULL&&z<root->elem)
{
root->left=y;
y->parent=root;
return;
}
else if(root->right==NULL&&z>root->elem)
{
root->right=y;
y->parent=root;
return;
}
if(z<root->elem)
insert(root->left,z);
else
insert(root->right,z);
} void createBST(BinarySearchTree *&root)
{
int arr[]= {,,,,,,,,,};
for(auto a:arr)
insert(root,a);
} //使用level的原因就是因为,不一定要到根,只有根的父节点为NULL
void print(BinarySearchTree *head,int level)
{
vector<int> vec;
for(int i=;i<level;++i)
{
vec.push_back(head->elem);
head=head->parent;
}
while(!vec.empty())
{
cout<<vec.back()<<" ";
vec.pop_back();
}
cout<<endl;
}
//root选择的是当前结束的节点,也就是从下往上开始最下面的节点,而node是往上找到的刚好满足的最后一个结点,root是在不断加深的
void find_sum(BinarySearchTree *root,int sum)
{
if(root==NULL)
return;
BinarySearchTree *node=root;
int tmp=;
for(int i=;node!=NULL;++i)
{
tmp+=node->elem;
if(tmp==sum)
print(root,i);
node=node->parent;
}
find_sum(root->left,sum);
find_sum(root->right,sum);
}
int main()
{
BinarySearchTree *root=NULL;
createBST(root);
cout<<"find sum is: "<<endl;
find_sum(root,);
return ;
}

方法三 完整代码:

#include<iostream>
#include<new>
#include<map>
#include<vector>
using namespace std; struct BinarySearchTree
{
int elem;
BinarySearchTree *parent;
BinarySearchTree *left;
BinarySearchTree *right;
BinarySearchTree(int x):elem(x),parent(NULL),left(NULL),right(NULL) {}
}; void insert(BinarySearchTree *&root,int z)
{
BinarySearchTree *y=new BinarySearchTree(z);
if(root==NULL)
{
root=y;
return;
}
else if(root->left==NULL&&z<root->elem)
{
root->left=y;
y->parent=root;
return;
}
else if(root->right==NULL&&z>root->elem)
{
root->right=y;
y->parent=root;
return;
}
if(z<root->elem)
insert(root->left,z);
else
insert(root->right,z);
} void createBST(BinarySearchTree *&root)
{
int arr[]= {,,,,,,,,,};
for(auto a:arr)
insert(root,a);
} //使用level记录选择v中的从哪个下标开始相加
void print(vector<int> v,int level)
{
for(int i=level;i<v.size();++i)
cout<<v[i]<<" ";
cout<<endl;
}
//root开始,将当前层的值加入v中
void find_sum(BinarySearchTree *root,int sum,vector<int> v,int level)
{
if(root==NULL)
return;
v.push_back(root->elem);
int tmp=;
for(int i=level;i>-;--i)
{
tmp+=v[i];
if(tmp==sum)
print(v,i);
}
//每一层将当前层的结点的值放入v中,由于不是传递的引用,所以同一层放入v中的值不会影响,从root结点开始保存每一层的
find_sum(root->left,sum,v,level+);
find_sum(root->right,sum,v,level+);
}
int main()
{
BinarySearchTree *root=NULL;
createBST(root);
vector<int> v;
cout<<"find sum is: "<<endl;
find_sum(root,,v,);
return ;
}

careercup-树与图 4.9

careercup-树与图 4.9的更多相关文章

  1. SqlServer-无限递归树状图结构设计和查询

    在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...

  2. Android开源图表之树状图和饼状图的官方示例的整理

    最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...

  3. D3树状图给指定特性的边特别显示颜色

    D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...

  4. D3树状图异步按需加载数据

    D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...

  5. &lbrack;整理&rsqb; ES5 词法约定文档树状图

    将ES5 词法说明整理为了树状图,方便查阅,请自行点开小图看大图:

  6. bzoj 4871&colon; &lbrack;Shoi2017&rsqb;摧毁&OpenCurlyDoubleQuote;树状图” &lbrack;树形DP&rsqb;

    4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...

  7. vue 树状图数据的循环 递归循环

    在main.js中注册一个子组件 在父组件中引用 树状图的数据格式 绑定一个数据传入子组件,子组件props接收数据 子组件中循环调用组件,就实现了递归循环

  8. ztree 文件夹类型的 树状图

    未套程序的源代码: 链接:http://pan.baidu.com/s/1nuHbxhf 密码:4aw2 已套程序的源代码: css样式: /*发布邮件 选择领导弹窗*/ .xuandao{ disp ...

  9. visio画等分树状图

    一 树状图形状 Search里搜索Tree,找到Double Tree或者Multi Tree的形状 二 分出更多branch 按住主干上的黄色小方块,拖出更多分支. 三 等分分支 将每个分支和对应的 ...

  10. ArcGIS教程:树状图

    摘要 构造可显示特征文件里连续合并类之间的属性距离的树示意图(树状图). 使用方法 · 输入特征文件必须採用预定的特征文件格式. 特征文件可使用 Iso 聚类或创建特征工具来创建.该文件必须至少包括两 ...

随机推荐

  1. sql server中自连接的使用

    一.用SQL自连接查询处理列之间的关系 SQL自身连接,可以解决很多问题.下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系.SQL代码如下: ...

  2. 释放C盘空间的27招优化技巧

    主要讲讲Windows操作系统在C盘空间不足的情况下,我们可以通过那些具体手段来增加C盘空间. 1.打开"我的电脑"-"工具"-"文件夹选项&quot ...

  3. auto&lowbar;ptr&comma; which can release the space automatically

    C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理. 使用std::auto_ptr,要#include <memory>.[1]  中文名 自动指针 外 ...

  4. About using UTF-8 fields in MySQL

    https://www.adayinthelifeof.nl/2010/12/04/about-using-utf-8-fields-in-mysql/ I sometimes hear: “make ...

  5. Memcache&lpar;1&rpar;

    一.缓存套路 原文地址:http://coolshell.cn/articles/17416.html Scaling Memcached at Facebook 好些人在写更新缓存数据代码时,先删除 ...

  6. &lbrack;原创&rsqb;安全系列之端口敲门服务(Port Knocking for Ubuntu 14&period;04 Server)

    Port Knocking for Ubuntu 14.04 Server OS:ubuntu 14.04 server 原理简单分析: 端口敲门服务,即:knockd服务.该服务通过动态的添加ipt ...

  7. BLE空中升级 谈(一)

    BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项 现在的智能设备(可穿戴,智能家居,智能玩具等)是越来越多了,大公司的产品颜值高,功能强大而完备的应该说是比比皆是,这里不谈论它是满足 ...

  8. tomcat 内存溢出处理方案

    找到tomcat7w.exe  在java  页 java options 最后添加 -XX:PermSize=256m-XX:MaxPermSize=512m

  9. OpenCV-Python入门教程7-PyQt编写GUI界面

    前面一直都是使用命令行运行代码,不够人性化.这篇用Python编写一个GUI界面,使用PyQt5编写图像处理程序.包括:打开.关闭摄像头,捕获图片,读取本地图片,灰度化和Otsu自动阈值分割的功能. ...

  10. 1&period;sklearn库的安装

    sklearn库 sklearn是scikit-learn的简称,是一个基于Python的第三方模块.sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的 ...