Given a binary tree, return all root-to-leaf paths.

For example, given the following binary tree:

  1. 1
  2. / \
  3. 2 3
  4. \
  5. 5

All root-to-leaf paths are:

  1. ["1->2->5", "1->3"]

思路:用两个stack<TreeNode*> in , s;

in : 记录当前的路径 p  , 和vector<int>path 相同,只不过一个记录的是 val ,一个记录点的指针。

s  : 记录每个节点的  p->right

v2s : 将path转换称符合要求的string

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:string v2s(vector<int>a){
  12. const int len = a.size();
  13. string re = "";
  14. char *p = new char[];
  15. for (int i = ; i<len; i++){
  16. stringstream ss; // 需要包含头文件 #include<sstream>
  17. string temp;
  18. ss << a[i];
  19. ss >> temp;
  20. re = re + temp;
  21. if (i != len - )
  22. re = re + "->";
  23. }
  24. return re;
  25. }
  26. vector<string> binaryTreePaths(TreeNode* root) {
  27. vector<int> path;
  28. vector<string> re;
  29. if (root == NULL) return re;
  30. TreeNode * p = root;
  31. stack<TreeNode*> in, s;
  32. while (p != NULL){
  33. if (p->left == NULL&&p->right == NULL){
  34. in.push(p);
  35. path.push_back(p->val);
  36. re.push_back(v2s(path));
  37. if (s.empty())
  38. return re;
  39. else {
              // 通过while循环,查找下一个需要遍历的点
  40. while (!in.empty() && !s.empty() && (in.top())->right != s.top()){
  41. in.pop();
  42. path.erase(path.end()-);
  43. }
  44. p = s.top();
  45. s.pop();
  46. }
  47. }
  48. else if (p->left == NULL&&p->right != NULL){
  49. path.push_back(p->val);
  50. in.push(p);
  51. p = p->right;
  52. }
  53. else if (p->left != NULL&&p->right == NULL){
  54. path.push_back(p->val);
  55. in.push(p);
  56. p = p->left;
  57. }
  58. else{
  59. path.push_back(p->val);
  60. in.push(p);
  61. s.push(p->right);
  62. p = p->left;
  63. }
  64. }
  65. return re;
  66. }
  67. };

另一道相似题目

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。

给定二叉树的根节点root,请返回所求距离。

思路:只需要将保存的路径进行比较,相同的去掉然后相加,就能算出路径长度。

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {
  8. }
  9. };*/
  10. class Tree {
  11. public:
  12. int getDis(TreeNode* root) {
  13. // write code here
  14. stack<TreeNode*> max, min;
  15. int m = INT_MIN, n = INT_MAX, re = 0;
  16. stack<TreeNode*> in, s;
  17. TreeNode *p = root;
  18. while (p != NULL){
  19. if (p->left == NULL&&p->right == NULL){
  20. in.push(p);
  21. if (p->val > m){
  22. max = in;
  23. m = p->val;
  24. }
  25. if (p->val < n){
  26. min = in;
  27. n = p->val;
  28. }
  29. while (!in.empty() && !s.empty() && (in.top())->right != s.top()){
  30. in.pop();
  31. }
  32. if (s.empty())
  33. break;
  34. else {
  35. p = s.top();
  36. s.pop();
  37. }
  38. }
  39. else if (p->left == NULL&&p->right != NULL){
  40. in.push(p);
  41. p = p->right;
  42. }
  43. else if (p->left != NULL&&p->right == NULL){
  44. in.push(p);
  45. p = p->left;
  46. }
  47. else {
  48. in.push(p);
  49. s.push(p->right);
  50. p = p->left;
  51. }
  52. }
  53. stack<TreeNode*> t1, t2;
  54. while (!max.empty()){
  55. t1.push(max.top());
  56. max.pop();
  57. }
  58. while (!min.empty()){
  59. t2.push(min.top());
  60. min.pop();
  61. }
  62. while (!t1.empty() && !t2.empty()){
  63. if (t1.top() != t2.top())
  64. break;
  65. else
  66. t1.pop(); t2.pop();
  67. }
  68. re = re + t1.size() + t2.size();
  69. return re;
  70. }
  71. };

  

leetcode : Binary Tree Paths的更多相关文章

  1. [LeetCode] Binary Tree Paths 二叉树路径

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  2. LeetCode——Binary Tree Paths

    Description: Given a binary tree, return all root-to-leaf paths. For example, given the following bi ...

  3. Python3解leetcode Binary Tree Paths

    问题描述: Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. E ...

  4. LeetCode Binary Tree Paths(简单题)

    题意: 给出一个二叉树,输出根到所有叶子节点的路径. 思路: 直接DFS一次,只需要判断是否到达了叶子,是就收集答案. /** * Definition for a binary tree node. ...

  5. leetcode Binary Tree Paths python

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...

  6. 【LeetCode】257. Binary Tree Paths

    Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...

  7. &lt;LeetCode OJ&gt; 257. Binary Tree Paths

    257. Binary Tree Paths Total Accepted: 29282 Total Submissions: 113527 Difficulty: Easy Given a bina ...

  8. [LintCode] Binary Tree Paths 二叉树路径

    Given a binary tree, return all root-to-leaf paths.Example Given the following binary tree: 1 /   \2 ...

  9. LeetCode_257. Binary Tree Paths

    257. Binary Tree Paths Easy Given a binary tree, return all root-to-leaf paths. Note: A leaf is a no ...

随机推荐

  1. jQuery css3鼠标悬停图片显示遮罩层动画特效

    jQuery css3鼠标悬停图片显示遮罩层动画特效 效果体验:http://hovertree.com/texiao/jquery/39/ 效果图: 源码下载:http://hovertree.co ...

  2. [moka同学笔记]四、Yii2.0课程笔记(魏曦老师教程)[匿名函数的使用操作]

    在评论页面中index.php中 [ 'attribute'=>'status', 'value'=>'status0.name', 'filter'=>Commentstatus: ...

  3. Spring学习系列(三) 通过Java代码装配Bean

    上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...

  4. InteliJ Shortcuts

    Open your browser with documentation for the element at the editor's caret Press Shift+F1 (View | Ex ...

  5. git的诞生

    Git的诞生   很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大是靠全世 ...

  6. CSS3 float深入理解浮动资料整理

    CSS浮动(float,clear)通俗讲解 CSS 浮动 CSS float浮动的深入研究.详解及拓展(一) CSS float浮动的深入研究.详解及拓展(二) 1.浮动实现图文环绕(理解难点) 浮 ...

  7. arcgis10.2.2桌面版具体的安装步骤过程

    先声明一下,这里的截图虽说是ArcGIS10.1版本的,但是安装步骤是对的,本人用ArcGIS10.2.2软件测试成功安装上 一.ArcGIS许可证管理器安装 1.在软件包文件夹license man ...

  8. 安卓开发之activity详解(sumzom)

    app中,一个activity通常是指的一个单独的屏幕,相当于网站里面的一个网页,它是对用户可见的,它上面可以显示一些控件,并且可以监听处理用户的时间做出响应. 那么activity之间如何进行通信呢 ...

  9. android handler传递消息机制

    当工作线程给主线程发送消息时,因为主线程是有looper的,所以不需要初始化looper,注意给谁发消息就关联谁的handler,此时用的就是主线程的handler handler会把消息发送到Mes ...

  10. ListView和Adapter的配合使用以及Adapter的重写

    ListView和Adapter的使用   首先介绍一下ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组成: ...