二叉树

0 概念

1.二叉树(Binary Tree)是含有n个结点的有限集合,具有以下几个特点:
  • 有且只有一个称(root)的节点
  • 其余结点划分为两个互不相交的子集L和R,称为左子树和右子树  
2.二叉树的一些基本概念有:
  • 度:结点的孩子个数称为度,对于二叉树,度可为0,1,2
  • 层次:从根结点开始定义,根结点为1,根的孩子为2,以此类推
  • 深度:二叉树中最大层次称为二叉树的深
3.二叉树性质
  • 度0结点 = 度2结点 + 1
4.完全二叉树与满二叉树
  • 满二叉树:深度为k且结点数为`2^k-1`的二叉树
  • 完全二叉树:深度为k,前k-1层为满二叉树,最后一层结点排列在左边。


1 二叉树实现

typedef struct btnode{
    int val;
    struct btnode *left;
    struct btnode *right;
} btnode, *btree;

btree create(int val, btree lt, btree rt)
{
    btree tree;
    tree = (btree)malloc(sizeof(btnode));

    if (tree == NULL) return NULL;

    tree->val = val;
    tree->left = lt;
    tree->right = rt;

    return tree;
}

void destroy(btree t)
{
    if (t == NULL) return;

    destroy(t->left);
    destroy(t->right);

    free(t);
    t = NULL;
}

2 二叉树三种遍历

2.1 中序遍历

中序遍历即 LDR,先遍历左子树,再遍历根,最后遍历右子树。
  • 递归形式的LDR
/*中序遍历递归版*/
void ldr_rec(btree t, void (*visit)(int))
{
    if (t == NULL) return;
    ldr_rec(t->left, visit);
    visit(t->val);
    ldr_rec(t->right, visit);
}
  • 非递归形式的LDR
/*中序遍历非递归版*/
void ldr_nor(btree t, void (*visit)(int))  //先把所有左结点入栈,然后访问结点,最后转右子树
{
    if (t == NULL) return;

    btree p = t;
    std::stack<btnode*> s;
    while(!s.empty() || p)
    {
        if (p
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值