二叉树的详细实现(含递归展开图)

简介: 二叉树的详细实现(含递归展开图)

@TOC

一、二叉树

1. 概念

一颗二叉树是结点的有限集合,该集合或者为空,或者由一个根节点加上两棵别称为左子树和右子树的二叉树的组成

2.特点

每个结点最多有两棵子树,即二叉树不存在大于2的结点

二叉树的子树有左右之分其子树次序不能颠倒

3.特殊二叉树

1.满二叉树

一个二叉树,如果每一个层的结点都达到最大值,则这个二叉树就是满二叉树,也就是说如果一个二叉树的层数为k,结点总数为(2^k)-1,则就为满二叉树

在这里插入图片描述  

2.完全二叉树

对于深度为k的,有n个结点的二叉树,且仅当其每一个结点与深度为k的满二叉树中编号从1到n的结点,称为完全二叉树

在这里插入图片描述  

4.性质

性质1.

若规定根节点的层数为1,则一颗非空二叉树的第i层上最多有2^(i-1)个结点

  在这里插入图片描述  

性质2.

若规定根节点的层数为1,则深度为h的二叉树的最大结点数是(2^h)-1

在这里插入图片描述  

性质3.

对于任何一颗二叉树,如果度为0其叶结点个数为n0,度为2的分支节点个数为n2,则n0=n2+1

(有几个子树 ,度就为多少)

在这里插入图片描述

性质4.

若规定根节点的层数为1,具有n个结点的满二叉树的深度h=log N

2^h -1=N

2^h=N+1

h= log 2  N+1

但是由于大O渐进表示法的省略 ,时间复杂度化成 O(log N)

不太懂大O渐进表示法的 :时间复杂度与空间复杂度

二、二叉树整体实现

1.前序的实现

void  prevorder(BTnode* root)//前序  根 左子树 右子树
{
    if (root == NULL)
    {
        printf("NULL ");
        return;
    }
    printf("%c ", root->data);
    prevorder(root->left);
    prevorder(root->right);
}

递归展开图

在这里插入图片描述

2.中序的实现

void  inorder(BTnode* root)//中序 左子树 根 右子树
{
    if (root == NULL)
    {
        printf("NULL ");
        return;
    }
    inorder(root->left);
    printf("%c ", root->data);
    inorder(root->right);
}

递归展开图

在这里插入图片描述


3.后序的实现

void  postorder(BTnode* root)//后序 左子树 右子树 根
{
    if (root == NULL)
    {
        printf("NULL ");
        return;
    }
    postorder(root->left);
    postorder(root->right);
    printf("%c ", root->data);
}

递归展开图

在这里插入图片描述

4. 节点个数

int treesize(BTnode* root)//节点个数
{
    if (root == NULL)
    {
        return 0;
    }
    return treesize(root->left) + treesize(root->right) + 1;
}

递归展开图

在这里插入图片描述

5. 叶节点个数

int treeleafsize(BTnode* root)//叶子节点的个数
{
    if (root == NULL)
    {
        return 0;
    }
    if (root->left == NULL && root->right == NULL)//只有当左右子树都为NULL时才会返回1
    {
        return  1;
    }
     return treeleafsize(root->left)+ treeleafsize(root->right);
}

递归展开图

在这里插入图片描述

6.层序遍历

void levelorder(BTnode* root)//层序遍历 需要借助数据结构栈来实现
{
    queue q;
    queueinit(&q);//初始化栈
    if (root)
    {
        queuepush(&q, root);//将根结点入栈
    }
    while (!queueempty(&q))
    {
         datatype front=queuefront(&q);//出栈
         queuepop(&q);//删除栈顶元素
         printf("%c ", front->data);
         if (front->left != NULL)
         {
             queuepush(&q, front->left);//判断此时该结点的左子树是否为空 若不空则入栈
         }
         if (front->right != NULL)
         {
             queuepush(&q, front->right);//判断此时该结点的右子树是否为空 若不空则入栈
         }
    }
    queuedestroy(&q);//销毁内存
}

在这里插入图片描述

目录
相关文章
|
7月前
|
算法
【递归搜索回溯专栏】专题二:二叉树中的深搜----求根节点到叶节点数字之和
【递归搜索回溯专栏】专题二:二叉树中的深搜----求根节点到叶节点数字之和
50 0
|
7月前
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
459 0
|
6月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
51 4
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
45 0
|
7月前
|
IDE 开发工具
遍历思路与子问题思路:详解二叉树的基本操作(二)
这篇内容介绍了二叉树的基本操作,包括通过遍历和子问题思路来解决不同的问题。
41 0
遍历思路与子问题思路:详解二叉树的基本操作(二)
|
7月前
遍历思路与子问题思路:详解二叉树的基本操作 (一)
这篇内容介绍了二叉树的基本概念和操作,包括二叉树的结构定义以及一些基本操作如前序遍历、中序遍历、后序遍历、获取树中节点个数等。
55 0
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
57 0
|
存储 编译器
二叉树的递归遍历与迭代遍历(图示)
本文将讲述二叉树递归与迭代的相关知识。
135 0
|
算法 数据库管理
【如何唯一确定一棵二叉树】思想分析及步骤详解
【如何唯一确定一棵二叉树】思想分析及步骤详解
306 0
【如何唯一确定一棵二叉树】思想分析及步骤详解