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 };