博客摘录「 数据结构(C语言版) 第 五 章 树与二叉树 知识梳理 + 作业习题详解」2023年5月9日

在这里插入图片描述

 二叉树的性质:

性质1:在二叉树的第i层上,最多有2的i-1次方个节点。最少有1个节点。

性质2:深度为i的二叉树至多有2的i次方减1个节点,最少有i个节点。

性质3:对于任何一棵二叉树,若2度的结点数有K个,则叶子数必定为K+1个。

可以参照下面的图来记忆。

 

 性质4如果有小数,就和求完全二叉树的叶子节点一样向下取整,上图为例。

性质5也是一样,都是向下取整 / 。        

这个定义指针有点奇怪,看下面的对照一下三叉链表 

二叉树的遍历方式:

这些都是递归的算法,有非递归的算法,但是比较复杂,懒得去看了

树的层次遍历,这个也很重要,树的层次遍历_听到微笑的博客-CSDN博客 

里面有概念图和完整代码。

如何建立二叉树 

 

 考点:(1条消息) 树、森林与二叉树的相互转换_森林转化为二叉树的方法_薛定谔的猫ovo的博客-CSDN博客

 

 

 答案为A,根的高度为1。

最多有(2^h)-1

11.建立与遍历二叉树 (25分)

以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’, 表示该二叉树是空树,否则该字符是相应结点的数据元素。读入相应先序序列,建立二叉链式存储结构的二叉树,然后中序遍历该二叉树并输出结点数据。
输入格式:
字符串形式的先序序列(即结点的数据类型为单个字符)
输出格式:
中序遍历结果
输入样例:
在这里给出一组输入。例如:
ABC##DE#G##F###

输出样例:
在这里给出相应的输出。例如:
CBEGDFA

#include<iostream>          // 包含输入输出流的头文件
#include<algorithm>         // 包含算法库的头文件
#include<cstdio>            // 包含C风格输入输出的头文件
#include<math.h>            // 包含数学函数的头文件
#include<cstring>           // 包含字符串操作的头文件
#include<bitset>            // 包含位操作的头文件
#include<vector>            // 包含向量容器的头文件
#include<queue>             // 包含队列容器的头文件

#define over(i,s,t) for(register int i = s;i <= t;++i)   // 定义循环宏,用于遍历从s到t的整数
#define lver(i,t,s) for(register int i = t;i >= s;--i)   // 定义逆序循环宏,用于遍历从t到s的整数
//#define int __int128         // 定义整数类型为__int128(已注释掉)
#define lowbit(p) p&(-p)      // 定义获取最低位1的宏函数

using namespace std;

typedef long long ll;        // 定义别名,将long long类型简写为ll
typedef pair<int,int> PII;   // 定义别名,将pair<int,int>类型简写为PII
const int INF = 0x3f3f3f3f;  // 定义无穷大常量
const int N = 1e5+7;         // 定义常量N为10^5+7
const int M = 2007;          // 定义常量M为2007

char ch;                     // 定义字符变量ch

struct node{                 // 定义二叉树节点的结构体
    char val;                // 节点的值
    node *ls;                // 左子树指针
    node *rs;                // 右子树指针
};

void build(node *&t){        // 递归构建二叉树的函数,传入参数为二叉树指针的引用
    cin>>ch;                 // 从输入流读取一个字符
    if(ch == '#')            // 如果字符为'#',表示为空节点
        t = NULL;            // 将当前节点指针置为NULL
    else {
        t = new node;        // 创建一个新的节点
        t->val = ch;         // 将节点的值设为当前字符
        build(t->ls);        // 递归构建左子树
        build(t->rs);        // 递归构建右子树
    }
}

void print(node *t){         // 按中序遍历打印二叉树节点值的函数
    if(t){
        print(t->ls);        // 先打印左子树
        cout<<(t->val);      // 打印当前节点的值
        print(t->rs);        // 再打印右子树
    }
}

void solve(){                // 主函数逻辑
    node *t = NULL;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值