Cracking The Coding Interview4.8
//You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum up to that value. Note that it can be any path in the tree - it does not have to start at the root.
//
// 译文:
//
// 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。 #include <iostream>
#include <string>
#include <vector>
#include <stack> #include <stdlib.h>
using namespace std; class tree
{
private:
struct treenode
{
char data;
treenode * left;
treenode * right;
treenode * parent;
}; treenode *root; int index; void create(treenode **p, char *str, int i, int size, treenode *fa)
{ if (i>size-1 || str[i] == '\0')
{
*p = NULL;
return;
} if (str[i] == '#')
{
*p=NULL;
}
else
{
*p = new treenode;
(*p)->data = str[i];
(*p)->parent = fa;
create(&((*p)->left),str,2*i+1,size, *p);
create(&((*p)->right),str,2*i+2,size, *p);
}
} void pOrder(treenode *p)
{
if (p==NULL)
{
return;
} // cout<<p->data<<" "<<endl;
pOrder(p->left);
pOrder(p->right);
} void zOrder(treenode *p)
{
if (p==NULL)
{
return;
}
zOrder(p->left);
cout<<p->data<<" "<<endl;
zOrder(p->right);
} void hOrder(treenode *p)
{
if (p==NULL)
{
return;
}
hOrder(p->left);
cout<<p->data<<" "<<endl;
hOrder(p->right);
} /***遍历每一个节点,朝上找父节点,如果能得到相等的sum ,则将该节点传递给print()***/
void findpath(treenode *p, int sum)
{
//cout<<"findpath"<<endl;
if (p == NULL)
{
return;
}
int i = 0;
int temp = 0;
treenode *pi = p;
while(pi != NULL)
{
temp +=pi->data - '0'; if (temp == sum)
{
print(p, i);
}
pi = pi->parent;
i++;
}
findpath(p->left, sum);
findpath(p->right, sum);
} /***从节点朝父节点找,应反向打印***/
void print(treenode *h, int level)
{
if (h == NULL)
{
return ;
}
//cout<<"print------"<<level<<endl;
stack<int>s;
int i=0; while(i <= level && h != NULL)
{
s.push(h->data - '0');
h = h->parent;
i++;
} while(!s.empty())
{
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
} /***与上一方法类似,只是这里通过vector来记录每个节点上一层经过的路径***/
void findpath(treenode *p, int sum, vector<int>&v, int level)
{
if (p == NULL)
{
return;
}
v.push_back(p->data - '0');
int temp = 0;
for (int i = level; i>-1;i--)
{
temp += v[i];/***从数组后面向前插入***/
if (temp == sum)
{
print(v,i);
}
}
vector<int>vl(v),vr(v);
findpath(p->left,sum, vl, level+1);
findpath(p->right,sum, vr, level+1);
}
/***从下向上,打印的是从该节点向上i层的data***/
void print(vector<int>v, int i)
{
if (v.empty() || i<0)
{
return;
}
for (int j = i;j < v.size(); j++)
{
cout<<v[j]<<" ";
}
cout<<endl;
} public: tree()
{
//root = create();
root = NULL;
index = 0;
} /***输入扩展层次遍历序列,#表示该节点为空***/
tree(char *s)
{
root = NULL;
index = 0;
if (s == NULL)
{
return;
} int size = strlen(s);
create(&root,s,0,size,NULL);
} ~tree()
{
/***清空二叉树***/
} void printPathSum(int sum)
{
findpath(root, sum);
} void printPathSum2(int sum)
{
vector<int>v;
findpath(root, sum,v,0);
} void preOrder(){pOrder(root);}
void inOreder(){zOrder(root);}
void postOreder(){ hOrder(root);}
}; int main()
{
/***扩展层次序列简立树***/
char t[14] = "1234#54#6##23";
tree s(t);
//s.preOrder();
s.printPathSum(10);
cout<<"xxxx"<<endl;
s.printPathSum2(10); cout<<"Over"<<endl;
return 0;
}
Cracking The Coding Interview4.8的更多相关文章
- Cracking The Coding Interview4.5
//原文: // // Write an algorithm to find the 'next' node (i.e., in-order successor) of a given node in ...
- Cracking The Coding Interview4.3
//Given a sorted (increasing order) array, write an algorithm to create a binary tree with minimal h ...
- Cracking the coding interview
写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...
- Cracking the coding interview 第一章问题及解答
Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...
- Cracking the coding interview--问题与解答
http://www.hawstein.com/posts/ctci-solutions-contents.html 作者:Hawstein出处:http://hawstein.com/posts/c ...
- 《cracking the coding intreview》——链表
前言 最近准备暑假回家回家修整一下,所以时间大部分用来完成项目上的工作,同时为了9月份的校招,晚上的时间我还在学习<cracking the coding intreview>,第二章链表 ...
- Cracking the Coding Interview(Trees and Graphs)
Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...
- Cracking the Coding Interview(Stacks and Queues)
Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...
- 《Cracking the Coding Interview》读书笔记
<Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...
随机推荐
- java ----> java.lang.NoClassDefFoundError
环境: centos 6.10,vim,jdk1.8_u72,zookeeper-3.4.6,maven3+ 正文: 使用zk的api操作创建节点发生java.lang.NoClassDefFound ...
- English trip V1 - B 19. Life of Confucius 孔子的生活 Teacher:Patrick Key:
In this lesson you will learn to describe a daily routine. (日常生活) 课上内容(Lesson) 词汇(Key Word ) contrac ...
- Python自学:第二章 删除空白
lstrip:剔除开头空白 strip:剔除两段空白 rstrip:剔除末尾空白 favorite: 最喜欢的 >>>favorite_language = "Python ...
- 【源码分析】Mybatis使用中,同一个事物里,select查询不出之前insert的数据
一.问题场景模拟问题:第二次查询和第一次查询结果一模一样,没有查询出我新插入的数据 猜测:第二次查询走了Mybatis缓存 疑问:那为什么会走缓存呢? 1.service方法 @Override @T ...
- 微信小程序选择视频,视频上传,视频播放
请查看链接地址看具体详情: 选择视频: https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-video.html#wxchoosevideoobje ...
- appium自动化环境搭建(python语言开发)
简述 1.安装jdk,配置环境变量 2.安装AndroidSDK,配置环境变量 3.安装Python 4.安装Python集成开发环境PyCharm 5.安装node 6.安装appium服务端 7. ...
- pycharm安装步骤
python环境配置教程 https://jingyan.baidu.com/article/c45ad29c05c208051653e270.html 由于安装Pycharm时忘记截图了,所以详细安 ...
- 【PowerDesigner】【5】数据模型 CDM
前言:各种箭头的含义其实我还是有点混乱,所以这里只做记录 参考博客: 1,Powerdesigner数据库建模--概念模型--ER图[转] - holycrap - 博客园https://www.cn ...
- 百度地图API 自定义坐标点及图片
var map = new BMap.Map("allmap");var point = new BMap.Point(105.955754,36.525109);map.cent ...
- java的泛型与反射机制
什么是泛型? 泛型,即“参数化类型”.顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参) ...