C#数据结构二叉树的特点以及存储实现
1.二叉树的定义
二叉树是n个有限元素的集合,该集合为空或者由一个称为根的元素以及两个不相交的左子树和右子树的二叉树组成;当集合为空是称为空二叉树。在二叉树中,一个元素也称为一个结点
2.二叉树的相关术语
1.结点的度:结点所拥有的子树个数称为度。即该结点下方所连接的子结点个数。上图结点E的度为2,F的度为1,H的度为0。
2.叶结点:度为0的结点称为叶结点;也称为末端结点。H、D、G、I都是末端结点。
3.分支结点:度不为0的结点称为分支结点;也称为为末端结点。一棵树的结点除了叶结点外,其他都是分支结点。
4.孩子结点、兄弟结点、父结点:树中一个结点的子树的根结点称为这个结点的孩子。这个结点称为它孩子结点的父结点。具有同一个父结点称为兄弟结点。上图中E是G和H的父结点;G称为E的孩子结点;G、H两者称为兄弟结点。
5.路径、路径长度:树的访问只能按照顺序访问。父结点只能访问它的子结点,不可越级访问。从某一结点到另一结点的路称为路径。如上图从根结点A开始到G的路径为ACEG。这个路径的路径长度为3。从A到D的路径为ABD,路径长度为2。
6.结点的层数:从根结点开始定义。根结点的层数为1.根结点的子结点层数加一,以此类推。树中所有结点的最大层数为该树的深度。上图的树的深度为4。
7.树的度:树中各结点度的最大值为该树的度。二叉树的度为2。
8.完全二叉树:除了最后一层都是满的(即左右孩子结点都不为空),最后一层从左至右连续称为完全二叉树。下图就是一个完全二叉树。
9.满二叉树:除最后一层以外所有结点的左右孩子结点都不为空。所有的满二叉树都是完全二叉树。但是完全二叉树不一定是满二叉树。如下图
二叉树的性质
1.一个非空二叉树的第i层上最多右2^(i-1)个结点。
2.一棵深度为k的二叉树中,最多具有2^k - 1个结点。
3.对于一个非空的二叉树。如果叶子节点树为m,度数为2的结点数为n,则有m = n+1。
4.具有n个结点的完全二叉树的深度k为【log 2 n】 +1。
二叉链表的结点结构
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tree
{
class Node<T>
{
#region 属性和构造方法
private T data; //本结点数据
private Node<T> leftChild; //结点的左孩子结点
private Node<T> rightChild; //结点的右孩子结点
public Node(T data,Node<T> leftChild,Node<T> rightChild)
{
this.data = data;
this.leftChild = leftChild;
this.rightChild = rightChild;
}
public Node(T data, Node<T> leftChild)
{
this.data = data;
this.leftChild = leftChild;
this.rightChild = null;
}
public Node(Node<T> leftChild, Node<T> rightChild