美文网首页
二叉树入门

二叉树入门

作者: Markity | 来源:发表于2020-04-25 21:18 被阅读0次

树的常用名词

  • 度:结点拥有子结点的数目
  • 孩子节点:结点的子结点
  • 双亲结点:结点的父结点
  • 叶子结点:度为0的结点
  • 分支结点:度不为0的结点
  • 兄弟结点:若多个结点的父结点是同一个结点,则它们互为兄弟结点
  • 树的深度:树的层数

二叉树分类

  • 满二叉树:每一层的结点数目都达到最大数目
  • 左斜数/右斜树:每个分支结点只有左树或右树
  • 完全二叉树:第一层到次下层的每一层结点数目达到最大,且最下层的叶子结点集中在左侧

二叉树断言

  • 推论1:第n层最多拥有的节点数为:
    数学公式
  • 推论2:一个深度为n的树,最多拥有的节点数为(利用等比数列推导):
    数学公式
  • 推论3:对于除最后一层,其余各层均达到最大结点数目的二叉树,它的层数为:


    数学公式
  • 推论4:满二插树一定是完全二叉树,反之不一定成立
  • 推论5:度为0的节点数 = 度为2的节点数+1

二叉树存储结构(C++)

struct TreeNode {
       TreeNode *left, *right;
       int val;
       TreeNode(int v):left(nullptr), right(nullptr), val(v) {}
};

二叉树遍历

前序遍历

void preorder(TreeNode *node) {
       if (node != NULL) {
              printf("%d\n", node->val);
              preorder(node->left);
              preorder(node->right);
       }
}

中序遍历

void inorder(TreeNode *node) {
       if (node != NULL) {
              preorder(node->left);
              printf("%d\n", node->val);
              preorder(node->right);
       }
}

后序遍历

void postorder(TreeNode *node) {
       if (node != NULL) {
              preorder(node->left);
              preorder(node->right);
              printf("%d\n", node->val);
       }
}

层序遍历

void layerorder(TreeNode *node, std::vector<int> *nums, bool root = true) {
       // 不能确定node是否为空
       if (!node) {
              return;
       }
       // 是否为根结点?
       if (root) {
              nums->push_back(node->val);
       }
      // 将左结点和右结点的值push到队列中
       if (node->left != nullptr)
              nums->push_back(node->left->val);
       if (node->right != nullptr)
              nums->push_back(node->right->val);
      // 对该结点的左结点和右结点左同样的事
       layerorder(node->left, nums, false);
       layerorder(node->right, nums, false);
}

总结:前/中/后序遍历直观地看只是输出当前结点值这个操作位置不同。而层序遍历依赖队列实现,更为复杂

相关文章

  • 结构|二叉树

    学习笔记,可能有些谬误,请批判性阅读。 二叉树是树结构的入门款。以下是二叉树的类定义。 任意二叉树的LCA LCA...

  • 二叉树就是这么简单

    一、二叉树就是这么简单 本文撇开一些非常苦涩、难以理解的概念来讲讲二叉树,仅入门观看(或复习).... 首先,我们...

  • 二叉树与汉诺塔

    二叉树与汉诺塔 前言 去年考研学习过程中,看过郝斌的数据结构入门(讲的挺好的),当时看过二叉树的遍历时,发现,其实...

  • Mysql索引不会怎么办?6000字长文教会你

    MySQL的索引入门真的很难吗 MySQL的索引入门真的很难吗索引存在的意义索引的类型哈希索引二叉树跳表B+Tre...

  • 二叉树入门

    去年二叉树算法的事情闹的沸沸扬扬,起因是Homebrew 的作者 @Max Howell 在 twitter 上发...

  • 二叉树入门

    树的常用名词 度:结点拥有子结点的数目 孩子节点:结点的子结点 双亲结点:结点的父结点 叶子结点:度为0的结点 分...

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • 二叉树基础

    本文撇开一些非常苦涩、难以理解的概念来讲讲二叉树,仅入门观看(或复习).... 首先,我们来讲讲什么是树: 树是一...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • LintCode - 验证二叉查找树(中等)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 难度:入门 要求: 给定一个二叉树,判断它是否是合法的二叉查...

网友评论

      本文标题:二叉树入门

      本文链接:https://www.haomeiwen.com/subject/vfrlwhtx.html