acm第二十次二叉树

一、 二叉树定义
二叉树是一种特殊的树型结构,它的度数为2的树。即二叉树的每个结点最多有两个子结点。每个结点的子结点分别称为左孩子、右孩子,它的两棵子树分别称为左子树、右子树。
二、二叉树有5中基本形态:
①空二叉树②仅有根节点的二叉树③右子树为空的二叉树④左右子树均非空的二叉树⑤左子树为空的二叉树
三、二叉树术语
前面引入的树的术语也基本适用于二叉树,但二叉树与树也有很多不同,如:首先二叉树的每个结点至多只能有两个结点,二叉树可以为空,二叉树一定是有序的,通过它的左、右子树关系体现出来。
四、一棵深度为k且有2k–1个结点的二叉树称为满二叉树。这种树的特点是每层上的结点数都是最大结点数。
五、 深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树。
六、二叉树的存储结构
①链式存储结构,即单链表结构或双链表结构(同树)。数据结构修改如下:
  typedef struct node;
  typedef node *tree;
  struct node
  {
   char data;
   tree lchild, rchild;
  };
  tree bt;
  或:
  typedef struct node;
  typedef node *tree;
  struct node
  {
   char data;
   tree lchild, rchild,father;
  };
  tree bt;
②顺序存储结构,即几个数组加一个指针变量。数据结构修改如下:
  const int n = 10;
  char data[n];
  char lchild[n];
  char rchild[n];
  int bt;
七、遍历二叉树的方法
所谓二叉树的遍历是指按一定的规律和次序访问树中的各个结点,而且每个结点仅被访问一次。“访问”的含义很广,可以是对结点作各种处理,如输出结点的信息等。遍历一般按照从左到右的顺序,共有3种遍历方法,先(根)序遍历,中(根)序遍历,后(根)序遍历。
㈠先序遍历的操作定义如下:
若二叉树为空,则空操作,否则
①访问根结点
②先序遍历左子树
③先序遍历右子树
void preorder(tree bt) //先序遍历根结点为bt的二叉树的递归算法
{
if(bt)
{
cout << bt->data;
preorder(bt->lchild);
preorder(bt->rchild);
}
}
㈡中序遍历的操作定义如下:
若二叉树为空,则空操作,否则
①中序遍历左子树
 ②访问根结点
③中序遍历右子树
   void inorder(tree bt) //中序遍历根结点为bt的二叉树的递归算法
   {
    if(bt)
    {
    inorder(bt->lchild);
    cout << bt->data;
    inorder(bt->rchild);
    }
   }
㈢后序遍历的操作定义如下:
若二叉树为空,则空操作,否则
①后序遍历左子树
②后序遍历右子树
③访问根结点
void postorder(tree bt) //后序遍历根结点为bt的二叉树的递归算法
{
if(bt)
{
postorder(bt->lchild);
postorder(bt->rchild);
cout << bt->data;
}
}
八、二叉树的其他操作
1、建立一棵二叉树
void pre_crt(tree &bt) //按先序次序输入二叉树中结点的值,生成
{
char ch;
ch = getchar(); //二叉树的单链表存储结构,bt为指向根结点的指针,’ ′ 表 示 空 树 i f ( c h ! = ′ &#x27;表示空树 if(ch != &#x27; if(ch!=’)
{
bt = new node; //建根结点
bt->data = ch;
pre_crt(bt->lchild); //建左子树
pre_crt(bt->rchild); //建右子树
}
else bt = NULL;
}
2、删除二叉树
void dis(tree &bt) //删除二叉树
{
if(bt)
{
dis(bt->lchild); //删左子树
dis(bt->rchild); //删右子树
delete bt; //释放父结点
}
}
3.插入一个结点到排序二叉树中
void insert(tree &bt, int n)//插入一个结点到排序二叉树中
{
if(bt)
{
if(n < bt->data) insert(bt->lchild, n);
else if(n > bt->data) insert(bt->rchild, n);
}
else
{
bt = new node; //新开一个空间
bt->data = n;
bt->lchild = bt->rchild = NULL;
}
}
4.在排序二叉树中查找一个数,找到返回该结点,否则返回NULL
tree findn(tree bt, int n) //在二叉树中查找一个数,找到返回该结点,否则返回NULL。
{
if(bt)
{
if(n < bt->data) findn(bt->lchild, n);
else if(n > bt->data) findn(bt->rchild, n);
else return bt;
}
else return NULL;
}
5.用嵌套括号表示法输出二叉树
void print(tree bt)//用嵌套括号表示法输出二叉树
{
if(bt)
{
cout << bt->data;
if(bt->lchild || bt->rchild)
{
cout << ‘(’;
print(bt->lchild);
if(bt->rchild) cout << ‘,’;
print(bt->rchild);
cout << ‘)’;
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值