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>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...
随机推荐
- Notepad++ 的资源管理器 右键菜单
以前装的版本,右键[Edit With Notepad++]都可以出来的. 最近安装的总是不行. 不知道是Windows的原因,还是新版本的原因. 网上也都是用workaround去解决的. 免费的东 ...
- spring cloud: Hystrix(五):如禁止单个FeignClient使用hystrix
spring cloud: Hystrix(五):如禁止单个FeignClient使用hystrix 首先application.yml / applicatoin.propreties的配置项:fe ...
- Django初始化之基本操作
1.指定要安装的Django版本 C:\Users\win7>pip install Django==1.11.8 2.查看安装的django版本 C:\Users\win7>pip sh ...
- 小程序获取openid 小程序授权
小程序获取openid 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. wx.login(Object object) 调用接口获取登录凭证(cod ...
- ZCU板级调试Bug记录
本帖用以记录在ZCU102板级调试间遇到的Bug. 1.PL端的AXI总线在读取DDR中的数据的时候,在一个burst内不能跨越page boundary.跨越page boundary会在该burs ...
- git 提交代码场景
1.首次提交代码到master git init git add . git commit -m '' git remote add origin +address git push -u origi ...
- 05 爬虫之scrapy
一 scrapy框架简介 01 什么是scrapy: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队 ...
- hashCode会出现负数吗,答案是肯定的
先来普及一下基本数据类型的长度: unsigned int 0-4294967295 int -2147483648-2147483647 unsigned long 0-429496 ...
- ALV打印模板(存代码)
*&---------------------------------------------------------------------* *& Report ZMMF013 * ...
- oracle查看列数据类型
select * from user_tab_columns where table_name = upper('表名')