LeetCode545.Boundary-of-Binary-Tree

weixin_30639719發表於2020-04-05
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 };

 

轉載於:https://www.cnblogs.com/demian/p/10193040.html