二叉树的性质:
性质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;