广度优先搜索,循环获取每一层第一个的值,然后返回最后一次的值
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 int findBottomLeftValue(TreeNode* root) { 15 int result = root->val; 16 queue<TreeNode*> que; 17 que.push(root); 18 while(!que.empty()){ 19 int count = que.size(); 20 result = que.front()->val; 21 for(int i = 0; i < count; i++){ 22 TreeNode* node = que.front(); 23 que.pop(); 24 if(node->left != nullptr) que.push(node->left); 25 if(node->right != nullptr) que.push(node->right); 26 } 27 } 28 return result; 29 } 30 };
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 bool hasPathSum(TreeNode* root, int targetSum) { 15 if(root == nullptr) return false; 16 if(root->val == targetSum && root->left == nullptr && root->right == nullptr) return true; 17 return hasPathSum(root->left, targetSum - root->val) 18 || hasPathSum(root->right, targetSum - root->val); 19 } 20 };
深度优先搜索 + 回溯
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 vector<vector<int>> pathSum(TreeNode* root, int targetSum) { 15 vector<vector<int>> result; 16 vector<int> vec; 17 dfs(root,targetSum,vec,result); 18 return result; 19 } 20 private: 21 void dfs(TreeNode* root, int targetSum, vector<int>& vec, vector<vector<int>>& result){ 22 if(root == nullptr) return; 23 vec.push_back(root->val); 24 if(root->left == nullptr && root->right == nullptr){ 25 if(root->val == targetSum){ 26 result.push_back(vec); 27 } 28 }else{ 29 dfs(root->left,targetSum - root->val, vec, result); 30 dfs(root->right, targetSum - root->val, vec, result); 31 } 32 vec.pop_back(); 33 } 34 };
先找到根节点(续遍历最后一个),然后切割,分别找到左右子树的中序和后续遍历,然后递归
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { 15 if(postorder.size() == 0) return nullptr; 16 // 根节点 17 TreeNode* root = new TreeNode(postorder.back()); 18 if(inorder.size() == 1) return root; 19 // 左子树 20 int index = 0; 21 for(int i = 0; i < inorder.size(); i++){ 22 if(inorder[i] == root->val) index = i; 23 } 24 postorder.resize(postorder.size() - 1); 25 vector<int> leftInorder(inorder.begin(),inorder.begin()+index); 26 vector<int> leftPostorder(postorder.begin(),postorder.begin()+index); 27 // 右子树. 28 vector<int> rightInorder(inorder.begin()+index+1,inorder.end()); 29 vector<int> rightPostorder(postorder.begin()+index,postorder.end()); 30 root->left = buildTree(leftInorder, leftPostorder); 31 root->right = buildTree(rightInorder, rightPostorder); 32 return root; 33 } 34 };
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { 15 if(preorder.size() == 0) return nullptr; 16 TreeNode* root = new TreeNode(preorder.front()); 17 if(inorder.size() == 1) return root; 18 int index = 0; 19 for(int i = 0; i < inorder.size(); i++){ 20 if(inorder[i] == root->val) index = i; 21 } 22 // 子树中序 23 vector<int> leftInorder(inorder.begin(),inorder.begin()+index); 24 vector<int> rightInorder(inorder.begin()+index+1,inorder.end()); 25 // 子树前序 26 vector<int> leftPreorder(preorder.begin()+1,preorder.begin()+1+index); 27 vector<int> rightPreorder(preorder.begin()+1+index,preorder.end()); 28 root->left = buildTree(leftPreorder, leftInorder); 29 root->right = buildTree(rightPreorder, rightInorder); 30 return root; 31 } 32 };
浙公网安备 33010602011771号