树与二叉树
树的定义和性质
树的概念:数据结构中把树枝分叉树、树叶、树根抽象为结点(node),其中树根抽象为根节点(root),且对一棵树来说最多存在一个根节点;把树叶概括为叶子结点(leaf);把茎干和树枝同一抽象为边(edge)。树就被定义为由若干结点和若干边组成的数据结构,且在树中的结点不能被边连接成环。根节点置于最上方,然后向下延伸出若干条边到达子结点(child)(从而向下形成子树)。
父亲结点、孩子结点、兄弟结点、祖先结点、子孙结点。
① 树可以没有结点,这种情况下把树称为空树(empty tree)。
② 树的层次(layer)从根结点开始算起,即根结点为第一层。
③ 把结点的子树棵数称为结点的度(degree),而树中结点的最大的度称为树的度。
④ 对有n个结点的树,边数一定是n-1。
⑤ 叶子结点被定义为度为0的结点。
⑥ 结点的深度(depth)是指从根结点开始自顶向下逐层累加至该结点时的深度值;结点的高度(height)是指从最底层叶子结点开始自底向上逐层累加。
⑦ 多棵树结合在一起称为森林(forest)。
二叉树的递归定义
二叉树的递归定义(从自身来定义自身):
① 要么二叉树没有根结点,是一棵空树。
② 要么二叉树由根结点、左子树、右子树组成,且左子树和右子树都是二叉树。
满二叉树
每一层的结点个数都达到了当层能到达的最大结点数。
完全二叉树
除了最下面一层之外,其余层的结点个数都达到了当层能达到的最大结点数,且最下面一层只从左至右连续存在若干结点。
二叉树的存储结构与基本操作
二叉树的存储结构
二叉树使用链表来定义。二叉树的结点有两条出边,因此指针域变成了两个,把这种链表称为二叉链表。
struct node{
typename data;//数据域
node* lchild; //指向左子树根结点的指针
node* rchild;