浅谈二叉树

1.二叉树的概念:

二叉树是一种非线性的数据结构,每个结点最多有两个子树,且有左右之分。

满二叉树:深度为k的二叉树有2^k - 1个结点的二叉树。

完全二叉树:如果将一个二叉树和满二叉树分别按从上到下,从左到右的顺序依次进行编码,若该二叉树中的每个结点编号都与满二叉树的编号一一对应,则称该二叉树为完全二叉树。

2.性质:

a.二叉树的第i层,最多拥有2^(i-1)个结点;

b.深度为k的二叉树,左右拥有2^k - 1个结点;

c.任意一个二叉树,度(子树个数)为0的结点个数n0与度为2的结点个数n2之间的关系为:n0 = n2 + 1;

d.具有n个结点的完全二叉树,其深度为int(log2n) + 1;

e.如果对一个完全二叉树按从上到下,从左到右的顺序依次进行编号,对任何结点i(1 <= i <= n)都有:

(1)if(i ==1),i为根结点,无双亲;if(i>1),则i的双亲结点为int (i/2);

(2)if(2i>n),则i没有左子树,if(2i <= n),则i的左子树为2i;

(3)if(2i+1>n),则i没有右子树,if(2i<=n),则i的右子树为2i+1;

3.二叉树的存储结构:

a.顺序存储,按照完全二叉树的编号依次放在连续的存储单元中

b.链式存储,二叉树的抽象数据类型:

struct btnode
{
datatype data;
btnode *lchild, *rchild;
};
4.遍历二叉树;

a.先序遍历,访问次序:根节点-左子树-右子树

void preorder(btnode *bt)
{
if(bt)
{
visit(bt);
preorder(bt->lchild);
preorder(bt->rchild);
}
}

b.中序遍历,访问次序:左子树-根节点-右子树

void preorder(btnode *bt)
{
if(bt)
{
preorder(bt->lchild);
visit(bt);
preorder(bt->rchild);
}
}

c.后序遍历,访问次序:左子树-右子树-根节点

void preorder(btnode *bt)
{
if(bt)
{
preorder(bt->lchild);
preorder(bt->rchild);
visit(bt);
}
5.二叉树的线索

概念:二叉树的链式存储只能直接访问到其结点的左右子树,不能在某种遍历序列中直接访问其前驱和后继,而正是利用二叉链中的空指针域来实现这一功能,叫做二叉树的线索。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值