• LeetCode545.Boundary-of-Binary-Tree


    1、头节点为边界节点
    2、叶结点为边界节点
    3、如果节点在其所在的层中是最左边或最右边,那么也是边界节点。

    思路:分成三部分来做:找左边界结点、叶结点、右边界结点。

    找左边界结点要遍历root的左子树,如果左孩子存在就加入vector,否则加入右孩子; 找叶结点,可以利用前序遍历,遍历结点改为判断结点是否是叶结点,是则加入;找右边界结点类似于找左边界结点,不过是其逆序,可以利用一个栈来辅助。 还要注意这三部分会有结点重合,在组合到一起的时候可以利用一个set来去掉重复的结点。注意不能在每个函数中用vector来返回结点中的值,否则无法去除重复的结点,因为树中结点的值不是唯一的,那就指针咯

     1 #include <iostream>
     2 #include <vector>
     3 #include <stack>
     4 #include <set>
     5 using namespace std;
     6 
     7 struct TreeNode {
     8     int val;
     9     TreeNode *left;
    10     TreeNode *right;
    11     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    12 };
    13 
    14 class Solution {
    15 public:
    16     void leftMost(TreeNode* root, vector<TreeNode *> &vec)
    17     {
    18         while(root)
    19         {
    20             vec.push_back(root);
    21             if(root->left)
    22                 root = root->left;
    23             else root = root->right;
    24         }
    25     }
    26 
    27     void leaf(TreeNode* root, vector<TreeNode *> &vec)
    28     {
    29         if(root)
    30         {
    31             if(!root->left && !root->right) vec.push_back(root);
    32             if(root->left)
    33                 leaf(root->left, vec);
    34             if(root->right)
    35                 leaf(root->right, vec);
    36         }
    37     }
    38 
    39     void rightMost(TreeNode* root, vector<TreeNode *> &vec)
    40     {
    41         stack<TreeNode *> st;
    42         while(root)
    43         {
    44             st.push(root);
    45             if(root->right)
    46                 root = root->right;
    47             else root = root->left;
    48         }
    49         while(!st.empty())
    50         {
    51             vec.push_back(st.top());
    52             st.pop();
    53         }
    54     }
    55 
    56     vector<int> boundaryOfBinaryTree(TreeNode* root) {
    57         vector<int> ans;
    58         if(!root) return ans;
    59         vector<TreeNode *> tmp;
    60         set<TreeNode *> s;
    61         leftMost(root, tmp);
    62         leaf(root, tmp);
    63         rightMost(root, tmp);
    64         for(TreeNode *p : tmp)
    65         {
    66             if(s.find(p) == s.end())
    67             {
    68                 ans.push_back(p->val);
    69                 s.insert(p);
    70             }
    71         }
    72         return ans;
    73     }
    74 };
  • 相关阅读:
    Android 废弃方法属性解决
    Android RecycleView分组
    Android 第三方库FlycoTabLayout
    Android 自定义dialog出现的位置
    Android 底部弹窗实现
    Android 自定义设置布局
    Android 微信、qq分享文本 (Intent)
    SpringBoot关于跨域的三种解决方案
    记录一次通用Mapper+自定义mapper出现的问题分析以及排查
    IDEA配置Maven+新建Maven项目
  • 原文地址:https://www.cnblogs.com/demian/p/10193040.html
Copyright © 2020-2023  润新知