数据结构之二叉树(C#版)

数据结构之二叉树(C#版)

  • 什么是二叉树
    • 人话版
    • 猿话版
    • 代码实现
      • 树结构
      • 树节点
  • 二叉树的遍历方法
    • 深度优先---Depth First Search(DFS)
      • 先序遍历
      • 中序遍历
      • 后序遍历
      • 深度优先遍历总结
    • 广度优先---Breadth First Search(BFS)
  • 总结

什么是二叉树

数据结构里面的“二叉树”这种结构,听起来很高大上,但实际上,他也的确是高大上,那么什么是二叉树呢?

下面我再次用灵魂给你画一下,什么是二叉树。
数据结构之二叉树(C#版)_第1张图片

人话版

可以看到,最顶端那个小伙伴最拽,为什么呢?因为他是老大(根节点),然后这位老大,左右手都提着一个小弟(左右子树),并不是每个老大左右手都能提着小弟的哦,有可能只提一个,也有可能两手空空,然后他的小弟呢,也跟他一样(如果小弟比老大能提的小弟多,那老大可能就打死这个小弟了),可能提着两个小弟,可能提着一个小弟,也可能这个小弟也是两手空空,那么如此反反复复就构成了一个二叉树。

题外话
一开始我画上面的图的时候,我将没有提小弟的那只手,是给他们砍掉的,但后面发现不对,小伙伴还是要双手都有,但提不提小弟,就看他自己咯,这里其实是对应于猿话版中的第二点

备注一下
图中红色的部分,其实在二叉树中并不存在,只是为了解释得更加生动,就把他画成比较像人(我也不敢说我画的是个人)

猿话版

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>
 {
   


        ///
        ///节点数据
        ///        
        private T _data;
        ///
        ///左节点
        ///
        

你可能感兴趣的:(数据结构,二叉树,数据结构)