栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

理解二叉树 【1】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

理解二叉树 【1】

二叉树的结构:
特点:

  1. 每个节点最多有两棵子树,所以不存在度大于2的节点。
  2. 左子树和右子树是有顺序的,顺序不能颠倒
  3. 即使树中的某个节点只有一棵子树,也要区分左子树或者右子树。
    度:结点拥有的子树个数(树的度是,树内各结点的度的最大值)
    深度/高度:结点的层次从根开始定义为第一次层。由上而下,树中结点的最大层数,即为树的深度。
  • 二叉树分类:
  • 空二叉树
  • 满二叉树(一个二叉树的左右孩子是满二叉树,一定是满二叉树吗? 不一定)
  • 完全二叉树(一个二叉树的左右孩子都是完全二叉树,一定是,完全二叉树吗?不一定)
  • 斜二叉树
  • 二叉树的性质:
    【1】若二叉树的层次从0开始,则而擦函数的第i层最多有2^i个。(i>=0)
    【2】深度为k的而二叉树至多有2^k -1个结点 (k>=1)
    【3】任何一个二叉树,如果其叶结点个数为n0,度为2的非叶结点个数为n2,则有n0=n2+1
    总结点 = n0 + n1 +n2
  • 完全二叉树:
    如下图:
    若设置二叉树高度为h,则公有h+1层,除了h层以外,其他各层(0~h-1)结点数都达到最大数,第h层开始,从右往左连续缺少若干个结点,即为完全二叉树。(缺失最底层的右边的结点,保证序号是连续的)

深度:[log2n]+1

二叉树的存储结构:

  • 顺序存储结构 : 一维数组存储
  • 链式存储结构
  • 静态结构

    这样就可以看出完全二叉树的优越性。顺序存储也可以反映出二叉树的结构。
    经过比较,完全二叉树,二叉树,以及斜而二叉树,可以发现,为了避免存储空间的浪费,顺序存储一般用于完全二叉树。
    他们之间之间的关系由(左孩子用 2i+1 右孩子用2i+2(数组的下标))
  • 二叉链表:
    根据二叉树每个结点最多有两个孩子的特点,所以设计了一个数据域,两个指针域。
    示例代码:
 typedef char ElemType;
 typedef struct BtNode
 {
  ElemType data;
  struct BtNode* leftchild;
  struct BtNode* rightchild; 
 }BtNode,*BinaryTree;
 

三叉链表:(需要回溯)

静态结构(链表很好的反映了这种逻辑关系)

  • 先序遍历
    根 左 右
void PreOder(BtNode* p)
{
	if (p != nullptr)
	{
		cout << p->data << " ";
		PreOder(p->leftchild);
		PreOder(p->rightchild);
	}
 }
  • 中序遍历
    左 根 右
    {
    若二叉树为空,则结束。
    左子树
    访问根节点
    访问右子树
    }
    • 示例代码:
  void InOder(BtNode *p)
  {
   if(p != nullptr)
   {
    InOder(p->leftchild);
    cout<data<<" ";
    InOder(p->rightchild);
    } 
  }
  • 后序遍历
    左 右 根
void EndOder(BtNode* p)
{
	if (p != nullptr)
	{
		
		EndOder(p->leftchild);
		EndOder(p->rightchild);
		cout << p->data << " ";
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/929008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号