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>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...
随机推荐
- python中列表和元组的操作(结尾格式化输出小福利)
一. 列表 1. 查 names = "YanFeixu WuYifan" names_1 = ["YanFeixu"," WuYifan" ...
- 日常英语---二、注册google的api的key
日常英语---二.注册google的api的key 一.总结 一句话总结:register google api key register_google_api_key 1.请通过电子邮件向我发送有关 ...
- (转).Net中自定义类作为Dictionary的key详解
在定义数据结构时,Dictionary提供了快速查找数据的功能,另外Dictionary< TKey, TValue >属于key-value键值对数据结构,提供了泛型的灵活性,是数据结构 ...
- (转)c# 断言类
Assert 类 使用 true/false 命题验证单元测试中的条件. 继承层次结构 System.Object Microsoft.VisualStudio.TestTools.UnitTesti ...
- 用basicTrendline画一元线性回归直线的置信区间
感慨统计学都还给老师了..恶补! R安装包的时候貌似需要用管理员权限启动,否则安装不了,国内镜像卡得渣渣,还是国外镜像真香~选择hongkong就好了. install.packages(" ...
- MySQL official tutorial
1.installation 2.setup environment variables add %/MySQL Server/bin to path. then restart cmd/powers ...
- spring ----> 搭建spring+springmvc+mybatis出现的几个问题
环境: idea ce 2018.1+maven3.5.3+mysql8.0.11+jdk1.8 spring4.3.7+spring mvc4.3.7+mybatis3.4.1+tomcat7.0. ...
- C# FTP上传文件至服务器代码
C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...
- You Don't Know JS: Async & Performance(第2章,Callbacks)
Chapter 2: Callbacks. Callbacks are by far the most common way that asynchrony in JS programs is exp ...
- p1473 Zero Sum
搜索,最后判断一下是否结果为0就行. #include <iostream> #include <cstdio> #include <cmath> #include ...