二叉树

一、二叉树理论基础

1.满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。通俗话理解:从底层开始到顶部的所有节点都全部填满的二叉树。深度为k,则有2^k-1个节点

2.完全二叉树:除了最底层节点没有节满,其余每层节点都达到最大值,并且最底层节点全都从最左边开始,按照顺序节若干个节点,中间不能出现空缺部分。

3.搜索二叉树:是一个有序树,遵循左节点小于根节点、右节点大于根节点的原则依次从上到下排列展开。

4.平衡搜索二叉树:是指满足左子树与右子树的高度差不超过1要求的搜索二叉树。

二、二叉树的定义与遍历

1.遍历方法:前序(根左右)、中序(左根右)、后序(左右根);

2.二叉树可用链表和数组定义,链表定义符合深度搜索法,数组定义按照层级搜索(根节点位置为i,则其左右节点位置分别为2i+1,2i+2)。

3.二叉树链表定义:

  1.  struct treeNode{
      int val;//数值
      treeNode* left;//左指针
      treeNode* right;//右指针
      treeNode(int x): val(x),left(NULL),right(NULL) {} // 构造函数

三、二叉树递归遍历

递归三步曲:

1.递归函数的参数和返回值

  1.  void traversal(TreeNode* cur, vector<int>& vec) //vec用于存放节点数值

2.确定终止条件:当遍历节点为空时,就return

  1.  if (cur == NULL) return;

3.单层递归逻辑

  1.  //前序遍历
     vec.push_back(cur->val);   // 中
     traversal(cur->left, vec); // 左
     traversal(cur->right, vec); // 右

前序遍历完整代码

  1.  class Solution {
     public:
         void traversal(TreeNode* cur, vector<int>& vec) {
             if (cur == NULL) return;
             vec.push_back(cur->val);    // 中
             traversal(cur->left, vec);  // 左
             traversal(cur->right, vec); // 右
        }
         vector<int> preorderTraversal(TreeNode* root) {
             vector<int> result;
             traversal(root, result);
             return result;
        }
     };//后序和中序遍历只需要把交换三个节点位置即可完成

四、二叉树迭代法遍历(栈结构)

  1.  //前序遍历:中左右
     class Solution {
     public:
         vector<int> preorderTraversal(TreeNode* root) {
             stack<TreeNode*> st;
             vector<int> result;
             if (root == NULL) return result;
             st.push(root);
             while (!st.empty()) {
                 TreeNode* node = st.top();                       // 中
                 st.pop();
                 result.push_back(node->val);
                 if (node->right) st.push(node->right);           // 右 栈先进后出
                 if (node->left) st.push(node->left);             // 左
            }
             return result;
        }
     };
     
     //后序遍历:左右中 === 中左右->中右左->左右中
     class Solution {
     public:
         vector<int> postorderTraversal(TreeNode* root) {
             stack<TreeNode*> st;
             vector<int> result;
             if (root == NULL) return result;
             st.push(root);
             while (!st.empty()) {
                 TreeNode* node = st.top();            //中
                 st.pop();
                 result.push_back(node->val);
                 if (node->left) st.push(node->left); // 左
                 if (node->right) st.push(node->right); // 右
            }
             reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序了
             return result;
        }
     };
     
     //中序遍历
     class Solution {
     public:
         vector<int> inorderTraversal(TreeNode* root) {
             vector<int> result;
             stack<TreeNode*> st;
             TreeNode* cur = root;
             while (cur != NULL || !st.empty()) {
                 if (cur != NULL) {
                     st.push(cur);
                     cur = cur->left;                // 左
                } else {
                     cur = st.top();
                     st.pop();
                     result.push_back(cur->val);     // 中
                     cur = cur->right;               // 右
                }
            }
             return result;
        }
     };

五、三种遍历的统一迭代法

  1.  //根据栈结构先进后出的特性,前序、后序和中序遍历三者互换只需交换备注三行代码即可
     //前序遍历
     class Solution {
     public:
         vector<int> preorderTraversal(TreeNode* root) {
             vector<int> result;
             stack<TreeNode*> st;
             if (root != NULL) st.push(root);
             while (!st.empty()) {
                 TreeNode* node = st.top();
                 if (node != NULL) {
                     st.pop();
                     if (node->right) st.push(node->right);  // 右
                     if (node->left) st.push(node->left);    // 左
                     st.push(node);                          // 中
                     st.push(NULL);
                } else {
                     st.pop();
                     node = st.top();
                     st.pop();
                     result.push_back(node->val);
                }
            }
             return result;
        }
     };

六、层序遍历(队列)

  1.  //层序遍历模板,后序很多用层序遍历的模板只需在此基础上做出小修改
     class Solution {
     public:
         vector<vector<int>> levelOrder(TreeNode* root) {
             queue<TreeNode*> que;
             if (root != NULL) que.push(root);
             vector<vector<int>> result;
             while (!que.empty()) {
                 int size = que.size();
                 vector<int> vec;
                 // 这里要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
                 for (int i = 0; i < size; i++) {
                     TreeNode* node = que.front();
                     que.pop();
                     vec.push_back(node->val);
                     if (node->left) que.push(node->left);
                     if (node->right) que.push(node->right);
                }
                 result.push_back(vec);
            }
             return result;
        }
     };
 
 
此页面的语言为中文(简体)
 
翻译为
 
 
 
 
  • 中文(简体)
  • 中文(繁体)
  • 丹麦语
  • 乌克兰语
  • 乌尔都语
  • 亚美尼亚语
  • 俄语
  • 保加利亚语
  • 克罗地亚语
  • 冰岛语
  • 加泰罗尼亚语
  • 匈牙利语
  • 卡纳达语
  • 印地语
  • 印尼语
  • 古吉拉特语
  • 哈萨克语
  • 土耳其语
  • 威尔士语
  • 孟加拉语
  • 尼泊尔语
  • 布尔语(南非荷兰语)
  • 希伯来语
  • 希腊语
  • 库尔德语
  • 德语
  • 意大利语
  • 拉脱维亚语
  • 挪威语
  • 捷克语
  • 斯洛伐克语
  • 斯洛文尼亚语
  • 旁遮普语
  • 日语
  • 普什图语
  • 毛利语
  • 法语
  • 波兰语
  • 波斯语
  • 泰卢固语
  • 泰米尔语
  • 泰语
  • 海地克里奥尔语
  • 爱沙尼亚语
  • 瑞典语
  • 立陶宛语
  • 缅甸语
  • 罗马尼亚语
  • 老挝语
  • 芬兰语
  • 英语
  • 荷兰语
  • 萨摩亚语
  • 葡萄牙语
  • 西班牙语
  • 越南语
  • 阿塞拜疆语
  • 阿姆哈拉语
  • 阿尔巴尼亚语
  • 阿拉伯语
  • 韩语
  • 马尔加什语
  • 马拉地语
  • 马拉雅拉姆语
  • 马来语
  • 马耳他语
  • 高棉语
 
随时将中文(简体)翻译为PRO
一律不翻译中文(简体)
一律不翻译i.cnblogs.com

LeetCode刷题知识点总结——二叉树的更多相关文章

  1. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  2. LeetCode刷题总结-树篇(下)

    本文讲解有关树的习题中子树问题和新概念定义问题,也是有关树习题的最后一篇总结.前两篇请参考: LeetCode刷题总结-树篇(上) LeetCode刷题总结-树篇(中) 本文共收录9道题,7道中等题, ...

  3. LeetCode刷题的一点个人建议和心得

    目录 1.    为什么我们要刷LeetCode? 2.    LeetCode的现状和问题 3.    本文的初衷 4.    LeetCode刷题建议 4.1入门数据结构,打基础阶段 4.2 建立 ...

  4. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  5. 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  6. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  7. 牛客网Java刷题知识点之泛型概念的提出、什么是泛型、泛型在集合中的应用、泛型类、泛型方法、泛型接口、泛型限定上限、泛型限定下限、 什么时候使用上限?泛型限定通配符的体现

    不多说,直接上干货! 先来看个泛型概念提出的背景的例子. GenericDemo.java package zhouls.bigdata.DataFeatureSelection; import ja ...

  8. LeetCode刷题总结-树篇(中)

    本篇接着<LeetCode刷题总结-树篇(上)>,讲解有关树的类型相关考点的习题,本期共收录17道题,1道简单题,10道中等题,6道困难题. 在LeetCode题库中,考察到的不同种类的树 ...

  9. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

随机推荐

  1. CentOS下mysql常用命令

    CentOS下mysql常用命令   1.开启和关闭 1.1.开启 service mysql start 1.2.关闭 service mysql stop 1.3.重启 service mysql ...

  2. 完全激活win server 2012的方法(亲测可行!)

    1.从微软官网下载评估版. 2.运行->CMD(最好以管理员身份运行)->输入"DISM /online /Get-CurrentEdition"(最好直接复制粘贴,然 ...

  3. 当.Net撞上BI可视化,这3种“套路”你必须知道

    最近葡萄在做技术支持,又遇到了客户给我们出的新问题. 事情是这样的. 这次客户使用的是.Net项目,直接做BI大屏过于复杂,所以想直接集成使用BI数据可视化分析大屏. 所以,这次我们就从--Wyn出发 ...

  4. 微信小程序结合原生JS实现电商模板(二)

    接 <微信小程序结合原生JS实现电商模板(一)>,在首页列表加入购物车到购物和模块增删数量,动态计算商品价格实现后,本次提交主要实现了商品详情(还不完善)简单页面,从商品详情页跳转到购物车 ...

  5. ASP.NET Core 6框架揭秘实例演示[24]:中间件的多种定义方式

    ASP.NET Core的请求处理管道由一个服务器和一组中间件组成,位于 "龙头" 的服务器负责请求的监听.接收.分发和最终的响应,针对请求的处理由后续的中间件来完成.中间件最终体 ...

  6. Android 12(S) 图形显示系统 - BufferQueue的工作流程(十)

    题外话 疫情隔离在家,周末还在努力学习的我  ..... 一.前言 上一篇文章中,有基本讲清楚Producer一端的处理逻辑,最后也留下了一个疑问: Consumer是什么时候来消费数据的?他是自己主 ...

  7. RESTful API设计规范总结

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 它的大原则容易把握,但是细节不容易做对.本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API. ...

  8. 论文解读(GMI)《Graph Representation Learning via Graphical Mutual Information Maximization》

    Paper Information 论文作者:Zhen Peng.Wenbing Huang.Minnan Luo.Q. Zheng.Yu Rong.Tingyang Xu.Junzhou Huang ...

  9. strcpy、strncpy 和安全的strncpy_s

    strcpy和strncpy摘于linux 内核源码的/lib/string.c char *self_strcpy(char *dest, const char *src) { char *tmp ...

  10. 阿里云删除mysql

    记录以下,学生买的轻量级服务器安装mysql之后发现没有初始密码,之后在被自己七搞八搞后彻底歇菜,就准备重新卸载安装 记录自己卸载过程首先运行rpm -qa | grep -i mysql出来的是:m ...