二叉树基础上

作者: TomGui | 来源:发表于2020-05-27 22:59 被阅读0次

    • 节点的高度=节点到叶子节点的最大路径(边数)
    • 节点的深度=根节点到这个节点所经历的边的个数
    • 节点的层数=节点的深度+1
    • 树的高度=根节点的高度

    二叉树

    二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。

    满二叉树

    叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫作满二叉树。

    完全二叉树

    叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫作完全二叉树。

    如何表达(或者存储)一颗二叉树?

    • 一种是基于指针或者引用的二叉链式存储法
    • 一种是基于数组的顺序存储法

    二叉树的遍历

    • 前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再再打印它的左子树,最后打印它的右子树。
    • 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。
    • 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。

    伪代码

    前序遍历的递推公式:
    preOrder(r) = print r->preOrder(r->left)->preOrder(r->right)
    
    中序遍历的递推公式:
    inOrder(r) = inOrder(r->left)->print r->inOrder(r->right)
    
    后序遍历的递推公式:
    postOrder(r) = postOrder(r->left)->postOrder(r->right)->print r
    

    代码

    void preOrder(Node* root) {
      if (root == null) return;
      print root // 此处为伪代码,表示打印 root 节点
      preOrder(root->left);
      preOrder(root->right);
    }
    
    void inOrder(Node* root) {
      if (root == null) return;
      inOrder(root->left);
      print root // 此处为伪代码,表示打印 root 节点
      inOrder(root->right);
    }
    
    void postOrder(Node* root) {
      if (root == null) return;
      postOrder(root->left);
      postOrder(root->right);
      print root // 此处为伪代码,表示打印 root 节点
    }
    

    时间复杂度:O(n)

    相关文章

      网友评论

        本文标题:二叉树基础上

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