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>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...
随机推荐
- h5游戏引擎有哪些
h5游戏引擎有哪些 一.总结 一句话总结: Layabox Egret Pixi.js Three.js PlayCanvas Cocos2d-js Hilo 1.H5游戏开发语言? Flash_AS ...
- 在Spring Boot中使用 @ConfigurationProperties 注解, @EnableConfigurationProperties
但 Spring Boot 提供了另一种方式 ,能够根据类型校验和管理application中的bean. 这里会介绍如何使用@ConfigurationProperties.继续使用mail做例子. ...
- feign三:覆写feign的默认配置及feign的日志
feign三:覆写feign的默认配置及feign的日志 默认配置复写 本项目地址:http://192.168.1.103:7601 本例是通过feign调用 eureka项目中的/eureka/a ...
- 图像识别 | AI在医学上的应用 | 深度学习 | 迁移学习
参考:登上<Cell>封面的AI医疗影像诊断系统:机器之心专访UCSD张康教授 Identifying Medical Diagnoses and Treatable Diseases b ...
- Prime Ring Problem HDU - 1016
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle ...
- mac下 配置homebrew 和java home
1.terminal下输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...
- Windows自动登录设置 Windows免密登录
设置方法如下:开始-运行-control userpasswords2:打开用户账号管理页面,将“要使用本机,用户必须输入用户名和密码”前面的勾去掉:点击 应用,确定之后.会提示用户输入需要自动登陆系 ...
- 【Oracle】【4】mybatis insert/update 数据后返回关键字段
1,插入 insert 场景:ID字段的值是数据库表“默认/表达式”(sys_guid())自动生成,插入一条数据到数据库后,需要获取该条数据的ID 解决方案: (1)Service层生成UUID p ...
- vivadio关联notepad++的关键式
D:\Program Files\Notepad++\notepad++.exe +[line number] [file name]
- PHP手册-函数参考-加密扩展
一.Crack.CSPRNG.Hash.Mcrypt.Mhash.OpenSSL.密码散列算法的对比 Crack CSPRNG Hash Mcrypt Mhash OpenSSL 密码散列算法 简 ...