数据结构之二叉树

树的定义:

  • 1、有且只有一个称为根的节点。

  • 2、有若干个互不相交的子树,这些子树本身也是一棵树。

  • 深度:从根节点到最底层节点的层数称之为深度。

  • 叶子节点:没有子节点的节点。

  • 非终端节点:非叶子节点。

  • 度:子节点的个数称为度。

  • 叶子节点:没有子节点的节点。
    在这里插入图片描述

图中A的度为3,C的度为1,F的度为0;
此数的深度为3。

  • 一般树:任意一个节点的子节点的个数都不受限制。
  • 二叉树:任意一个节点的子节点的个数最多为两个,且位置不能改变。
  • 森林:n个还不相交的数的集和。

二叉树的性质

  • 性质1:二叉树的第i层上至多有在这里插入图片描述

个节点。

  • 性质2:深度为k的二叉树至多有在这里插入图片描述
    个节点。
  • 性质3:对于任何一颗二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1。

二叉树的分类

  • 一般二叉树
  • 满二叉树
  • 完全二叉树:如果只是删除满二叉树最底层最右边的连续若干个节点,形成的二叉树为完全二叉树。

树的存储

  • 链式存储

  • 一般树存储

  • 森林存储

链式存储

代码如下:

//链式二叉树
#include<iostream>
#include<malloc.h>
#include<stdio.h>
using namespace std;
typedef struct BTnode
{
 char data;                  //存储的数据
 struct BTnode * pLchild;    //左孩子
 struct BTnode * pRchild;    //右孩子
}node,*NODE;
NODE creatBTree();               //建立树
void PreTraverseBTree(NODE);    //先序遍历
void MinTraverseBTree(NODE);	//中序遍历
void PostTraverseBTree(NODE);	//后序遍历
int main()
{
 NODE pt=creatBTree();
 cout<<"先序遍历"<<endl;
 PreTraverseBTree(pt);  //先序遍历
 cout<<"中序遍历"<<endl; 
 MinTraverseBTree(pt);   //中序 
 cout<<"后序遍历"<<endl; 
 PostTraverseBTree(pt);   //后序     
 return 0;
}
void PostTraverseBTree(NODE pt)  //后序遍历 
{
  if(pt!=NULL)
 {
  if(pt->pLchild!=NULL)
  {
   MinTraverseBTree(pt->pLchild); 
  } 
  
  if(pt->pRchild!=NULL)
  {
   MinTraverseBTree(pt->pRchild);
  }
  cout<<pt->data<<endl;
 }
 //先访问左子树
 //在访问右子树
 //在访问根节点 
}
void MinTraverseBTree(NODE pt)   //中序遍历 
{
 if(pt!=NULL)
 {
  if(pt->pLchild!=NULL)
  {
   MinTraverseBTree(pt->pLchild); 
  } 
  cout<<pt->data<<endl;
  
  if(pt->pRchild!=NULL)
  {
   MinTraverseBTree(pt->pRchild);
  }
 }  
 //先访问左子树
 //在访问根节点
 //在访问右子树 
}
void PreTraverseBTree(NODE pt)
{
 if(pt!=NULL)
 {
 cout<<pt->data<<endl;
 PreTraverseBTree(pt->pLchild);
 PreTraverseBTree(pt->pRchild);
 }
 //pt->pLchild 可以代表整个左子树   
 //先访问根节点 
 //在访问左子树
 //在访问右子树  
} 
NODE creatBTree()
{
 NODE PA=(NODE)malloc(sizeof(node));
 NODE PB=(NODE)malloc(sizeof(node));
 NODE PC=(NODE)malloc(sizeof(node));
 NODE PD=(NODE)malloc(sizeof(node));
 NODE PE=(NODE)malloc(sizeof(node)); 
 PA->data='A';
 PB->data='B';
 PC->data='C';
 PD->data='D';
 PE->data='E'; 
 PA->pLchild=PB;
 PA->pRchild=PC;
 PB->pLchild=PB->pRchild=NULL;
 PC->pLchild=PD;
 PC->pRchild=NULL;
 PD->pLchild=NULL;
 PD->pRchild=PE;
 PE->pLchild=PE->pRchild=NULL; 
 return PA; 
} 
 

链表中建立的树如图所示在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值