当前位置:   article > 正文

代码随想录训练营day14|LeetCode二叉树part1

代码随想录训练营day14|LeetCode二叉树part1

@代码随想录@程序员Carl

原文讲解:第六章 二叉树part01 (qq.com)

快期末了,加速赶੭ ˙ᗜ˙ )੭

目录

理论基础

 二叉树的递归遍历(必须掌握)

 迭代遍历(比递归难不止一点)


理论基础

视频讲解:二叉树理论基础

文字讲解版:代码随想录 (programmercarl.com)

直接看视频就好了,2倍速15分钟,很详细。文字讲解字太多,看着头疼(快乐+99,智商-99)。

我自己不太了解的:

1.二叉搜索树不一定是完全二叉树,只要左右字数深度差不大于1就行。

2.要有意识地了解自己平常使用的容器,它的底层实现是怎样的。

C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间复杂度是logn

unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表。 

3.

4.⚝二叉树的定义,LeetCode不会让我们写:

  1. struct TreeNode{
  2. int val;
  3. TreeNode* left;
  4. TreeNode* right;
  5. //C++里一般要构造函数进行初始化
  6. TreeNode() : val(0), left(nullptr), right(nullptr) {}
  7. TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  8. TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  9. };

 二叉树的递归遍历(必须掌握)

视频讲解:LeetCode:144.前序遍历,145.后序遍历,94.中序遍历_哔哩哔哩_bilibili

LeetCode:144. 二叉树的前序遍历 

LeetCode:94. 二叉树的中序遍历 

LeetCode:145. 二叉树的后序遍历  

不太懂的可以先看理论基础部分。不要忘了&符号! 

前序遍历(中左右): 

  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. //这个函数用来遍历二叉树,不用返回值
  15. void traversal(TreeNode *current,vector<int>& vector){
  16. if(current==nullptr) return;
  17. //中
  18. vector.push_back(current->val); //易错点:忘记加->val
  19. //左
  20. traversal(current->left,vector);
  21. //右
  22. traversal(current->right,vector);
  23. }
  24. vector<int> preorderTraversal(TreeNode* root) {
  25. vector<int> result;
  26. traversal(root,result);
  27. return result;
  28. }
  29. };

 中序遍历(左中右),修改traversal函数就OK:

  1. void traversal(TreeNode* cur,vector<int>& vec){
  2. if(cur==nullptr) return;
  3. traversal(cur->left,vec); //左
  4. vec.push_back(cur->val); //中
  5. traversal(cur->right,vec); //右
  6. }

 后序遍历(左右中),修改traversal函数:

  1. void traversal(TreeNode* cur,vector<int>& vec){
  2. if(cur==nullptr) return;
  3. traversal(cur->left,vec);
  4. traversal(cur->right,vec);
  5. vec.push_back(cur->val);
  6. }
 迭代遍历(比递归难不止一点)

前序与后序:视屏讲解前序与后序遍历_哔哩哔哩_bilibili 

中序(比前后序难):视屏讲解中序遍历 _哔哩哔哩_bilibili

中序的视频讲解代码有个错误,while的判断条件应该是||,而不是&&。

迭代遍历原文讲解:代码随想录 (programmercarl.com)

底层实现:栈。 LeetCode链接还是上面的144、94、145题。

注意:

1.因为栈是先进后出,所以前序遍历时右节点要比左节点先放入栈中,后序遍历相反。

2.最后两行代码是我的知识盲点,复习的时候看一下。

3.我老忘弹出栈元素,导致死循环。

前序和后序遍历:

  1. //前序遍历
  2. class Solution {
  3. public:
  4. vector<int> preorderTraversal(TreeNode* root) {
  5. vector<int> result;
  6. stack<TreeNode*> st;
  7. //易漏:root节点为空的情况
  8. if(root==nullptr) return result;
  9. st.push(root);
  10. while(!st.empty()){
  11. TreeNode* node=st.top();
  12. st.pop();
  13. result.push_back(node->val);
  14. //右节点要比左节点先入栈,这和迭代法遍历二叉树的顺序相反
  15. if(node->right) st.push(node->right); //右
  16. if(node->left) st.push(node->left); //左
  17. }
  18. return result;
  19. }
  20. };
  21. //后序遍历
  22. //改变两行代码的位置就行,如下:
  23. if(node->left) st.push(node->left); //左
  24. if(node->right) st.push(node->right); //右

中序遍历:

  1. class Solution {
  2. public:
  3. vector<int> inorderTraversal(TreeNode* root) {
  4. vector<int> result;
  5. stack<TreeNode*> st;
  6. TreeNode* cur = root;
  7. while (cur != nullptr || !st.empty()) {
  8. if (cur != nullptr) { // 指针来访问节点,访问到最底层
  9. st.push(cur); // 将访问的节点放进栈
  10. cur = cur->left; // 左
  11. } else {
  12. cur = st.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据)
  13. st.pop();
  14. result.push_back(cur->val); // 中
  15. cur = cur->right; // 右
  16. }
  17. }
  18. return result;
  19. }
  20. };

统一迭代法我还没看。 

二叉树终于入门了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/182827?site
推荐阅读
相关标签
  

闽ICP备14008679号