【李木华】二叉树的一般概念

来源:互联网 发布:wps office for mac 编辑:程序博客网 时间:2024/05/16 07:07

二叉树的定义

  一棵二叉树(binary tree)有结点(node)的有限集合组成,这个集合或者为空(empty),或者有一个根节点(root)及两个棵不相交的二叉树组成,这两颗二叉树分别称为这个根结点的左子树(left subtree)和右子树(right subtree)。如下图如所示:

* 结点M的深度(depth)就是从根节点到M的路径长度。
* 树的高度(height)等于最深结点的深度加1。
* 任何深度为d的结点的层数(level)都为d。
* 根结点层数为0,深度也为0。
* 没有非空子树的结点称为叶结点(leaf)。至少有一个非空子树的结点称为分支结点或内部结点(internal node)。
* 满二叉树(full binary tree):满二叉树的每一个结点或者是一个分支结点,并恰好有两个非空子结点或者是叶结点。如下图:

  • 完全二叉树(complete binary tree):从根结点起每一层从左至右填充。一棵高度为d的完全二叉树出了d-1层以外,每一层都是满的。底层叶结点集中在左边的若干位置上。如下图:

满二叉树定理:

  • 定理一:非空满二叉树的叶结点数等于其分支结点数加1。
  • 定理二:一棵非空二叉树空子树的数目等于其结点数目加1。

二叉树的ADT:

template<typename E>class BinNode{public:    virtual ~BinNode() {}    virtual E& element() = 0;                 //返回当前结点的值    virtual void setElement(const E&) = 0;    //设置当前结点的值    virtual BinNode* left() const = 0;        //返回左子结点    virtual void setLeft(BinNode*) = 0;       //设置左子结点    virtual BinNode* right() const = 0;       //返回右子结点    virtual void setRight(BinNode*) = 0;      //设置右子节点    virtual bool isLeaf() = 0;                //判断是否为叶结点};

遍历二叉树:

  • 按照一定顺序访问二叉树的结点,称为遍历(traversal)。
  • 对每个结点都进行一次访问并将其列出,称为二叉树节点的枚举(enumeration)。
  • 遍历分为前序遍历、中序遍历和后续遍历。

以下图为例:

  • 前序遍历(preorder traversal):先访问结点,然后访问其子节点。即ABDCEGFHI。
  • 中序遍历(inorder traversal):先访问左子结点(包括整棵子树),然后访问该节点,最后访问右子节点(包括整棵子树)。即BDAGECHFI。
  • 后序遍历(postorder traversal):先访问节点的子节点(包括它们的子树),然后再访问该节点。即DBGEHFICA。


Copyright© by 李木华
Date:2017.1.18

0 0
原创粉丝点击