数据结构之二叉树(C#版)
什么是二叉树
数据结构里面的“二叉树”这种结构,听起来很高大上,但实际上,他也的确是高大上,那么什么是二叉树呢?
下面我再次用灵魂给你画一下,什么是二叉树。
人话版
可以看到,最顶端那个小伙伴最拽,为什么呢?因为他是老大(根节点),然后这位老大,左右手都提着一个小弟(左右子树),并不是每个老大左右手都能提着小弟的哦,有可能只提一个,也有可能两手空空,然后他的小弟呢,也跟他一样(如果小弟比老大能提的小弟多,那老大可能就打死这个小弟了),可能提着两个小弟,可能提着一个小弟,也可能这个小弟也是两手空空,那么如此反反复复就构成了一个二叉树。
题外话:
一开始我画上面的图的时候,我将没有提小弟的那只手,是给他们砍掉的,但后面发现不对,小伙伴还是要双手都有,但提不提小弟,就看他自己咯,这里其实是对应于猿话版中的第二点
备注一下:
图中红色的部分,其实在二叉树中并不存在,只是为了解释得更加生动,就把他画成比较像人(我也不敢说我画的是个人)
猿话版
1.首先二叉树是树;
2.二叉树每个元素都有只有两棵子树(左子树和右子树,其中一个或两个可以为空);
3.二叉树中每个元素子树都是有序的,分为左子树和右子树(这里的有序指的是左右的顺序)。
代码实现
树结构
//二叉树基类
public abstract class BinaryTreeBase<T>
{
public abstract BinaryTreeNode<T> Root {
get; }
}
//二叉树
public class BinaryTree<T> : BinaryTreeBase<T>
{
//根节点
private BinaryTreeNode<T> _root;
public override BinaryTreeNode<T> Root {
get {
return _root; } }
public BinaryTree(BinaryTreeNode<T> rootNode)
{
_root = rootNode;
}
public BinaryTree(T rootData)
{
_root = new BinaryTreeNode<T>(rootData);
}
}
一棵二叉树的基本结构,可以参考上述代码,这里我为什么写了一个二叉树的基类,是为了我下一篇讲述二叉搜索树做准备的,因为代码写好了,也就懒得改了。
其实二叉树的结构,主要的就是保存一个根节点咯,其他类似计算二叉树的层数和元素个数,这里先暂时不提及了。
树节点
public class BinaryTreeNode<T>
{
///<summary>
///节点数据
///<summary>
private T _data;
///<summary>
///左节点
///<summary>