二叉树的定义

Posted 勇士后卫头盔哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的定义相关的知识,希望对你有一定的参考价值。

前言

定义:
二叉树是由n(n>=0)个结点组成的有限集合,该集合或者为空,或者是由一个根结点加上两颗分别称为左子树和右子树的,互不相交的二叉树组成

在此之前我们已经实现过了通用树结构,通用树结构中的每个结点都可以有任意多的孩子,都可能具有无线形态,所以很复杂,我们可以简化结点中孩子的数量,之前实现的通用树结构是用双亲孩子表示法来实现的,如下图所示,每个结点都有一个指向双亲的指针,每个结点都有若干个指向其孩子的指针

除此之外还有一种树结构模型叫孩子兄弟表示法,如下图所示,每个结点都有一个指向其第一个孩子的指针,每个结点都有一个指向其第一个右兄弟的指针,可以看出孩子兄弟表示法能够表示任意的树形结构,每个结点包含一个数据成员和两个指针成员,孩子结点指针和兄弟结点指针构成了"树杈",就是所谓的二叉树,孩子兄弟表示法能够将通用树转化为二叉树

二叉树还有满二叉树和完全二叉树之分,定义如下
满二叉树
如果二叉树中所有分支结点的度数都为2,且叶子结点都在同一层次上,则称这类二叉树为满二叉树
完全二叉树
如果一颗具有n个结点的高度为K的二叉树,它的每一个结点都与高度为k的满二叉树中编号为1-n的结点一一对应,则称为这棵二叉树为完全二叉树(从上到下从左到右)

二叉树的深层特性

1
在二叉树的第i层最多有2的i-1次方个结点
2
在二叉树的第i层最多有2的i次方个结点-1个结点
3
对于任何一颗二叉树,如果其叶节点有n0个,度为2的非叶节点有n2个,则有n0=n2+1
4

5

二叉树的存储设计

设计要点
BTree为二叉树结构,每个结点最多只有两个后继结点
BTreeNode只包含4个固定的公有成员(一个数据成员,两个指向后继结点的指针成员,一个指向父节点的指针成员便于遍历)
实现树结构的所有操作(增,删,查等)

BTree.h

namespace CGSLib

  template <typename T>
  class BTree : public Tree<T>
  
   bool insert(TreeNode<T>* node)
    
    
    bool insert(const T& e,TreeNode<T>* parent)
    
    SharedPointer< Tree<T> > remove(const T& value)
    
    SharedPointer< Tree<T> > remove(TreeNode<T>* node)
    
    TreeNode<T>* find(const T& value)const
    
    TreeNode<T>* find(TreeNode<T>* node)const
    
    TreeNode<T>* root()const
    
    int degree()const
    
    int count()const
    
    int height()const
    
    void clear()
    
  ;

BTreeNode.h

namespace CGSLib

    template <typename T>
    class BTreeNode : public TreeNode<T>
    
       public:
       BTreeNode<T> *r_pointer;
       BTreeNode<T> *l_pointer;
       BTreeNode()
       
          r_pointer = NULL;
          l_pointer = NULL;
       
       static BTreeNode<T>* NewNode()
       
           BTreeNode<T>* ret = new BTreeNode<T>();
           if(ret != NULL)
           
               ret->m_flag = true;
           
           return ret;
       
    ;

以上是关于二叉树的定义的主要内容,如果未能解决你的问题,请参考以下文章

java 数据结构与算法---二叉树

算法总结:左神—利用二分查找思想:完全二叉树节点数,求一个整数k的N次方

java如何创建一颗二叉树

二叉树的定义性质及遍历方法

每日辞典 二叉树的递归定义

二叉树的三种遍历方式