i
−
1
{2}^{i-1}
2i−1个结点;
2. 深度为 k 的二叉树至多有
2
k
{2}^{k}
2k-1个结点;
3. 对任何一棵二叉树T,如果其终端结点的个数(也就是叶子节点数)为
n
0
{n}_{0}
n0,度为2的结点个数为
n
2
{n}_{2}
n2,则
n
0
{n}_{0}
n0=
n
2
{n}_{2}
n2+1。(大话数据结构P143)
二叉树的遍历方法
二叉树的遍历方式主要可以分为四种:前序遍历、中序遍历、后序遍历和层序遍历。
前序遍历
简单记为中左右,也就是说先访问根节点,然后前序遍历左子树,再前序遍历右子树。
遍历的顺序为ABDGHCEIF
中序遍历
简单记为左中右,也就是说先访问二叉树最左边的结点,然后再访问中间的结点,最后再访问右边的结点。·
遍历的顺序为GDHBAEICF
后序遍历
简单记为左右中,也就是说先访问二叉树最左边的结点,然后再访问右边的结点,最后再访问中间的结点。·
遍历的顺序为GHDBIEFCA
层序遍历
从根结点开始访问,从上而下逐层遍历,在同一层中·,按从左到右的顺序对结点逐个访问。
遍历的顺序为ABCDEFGHI
前序遍历、中序遍历和后序遍历就是中的位置不一样,前序遍历就是中左右,中序遍历就是左中右,后序遍历就是左右中。
前中后序遍历都是深度搜索,层序遍历是广度搜索。
二叉树的实现
⼆叉树的定义
struct TreeNode {
int val;
TreeNode \*left;
TreeNode \*right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
使用前序遍历创建二叉树
void CreatTreeNode(TreeNode\*&T){
char c;
cin >> c;
if(c=='\*'){
T = NULL;
return;
}
else{
T = new TreeNode;
T->val = c;
CreatTreeNode(T->left);
CreatTreeNode(T->right);
}
}
前序遍历
class Solution {
public:
void traversal(TreeNode\* cur, vector<int>& vec) {
if (cur == NULL) return;
vec.push\_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
}
vector<int> preorderTraversal(TreeNode\* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
中序遍历
void traversal(TreeNode\* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
vec.push\_back(cur->val); // 中
traversal(cur->right, vec); // 右
}
后序遍历
void traversal(TreeNode\* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
vec.push\_back(cur->val); // 中
}
参考文章:使用C++创建二叉树和其基本操作
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
5Z8Jh-1714269394025)]
[外链图片转存中…(img-BDgaz0Jq-1714269394026)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新