目录
一:二叉树基础知识
1.分类(4类)(无数字2)(有数字2)
满二叉树 2^k-1
完全二叉树(堆):除了底层的节点未填满,其余层节点都达到最大值,并在最下面层的节点都集中在最左边 设最底层为h层,则该层包含1-2^(h-1)个节点
二叉搜索树(有序树)(有数值):左右子树称为二叉排序树 下面都是二叉搜索树
左子树的节点值小于中间节点,右子树的节点值大于中间节点(时间复杂度logn)
、
平衡二叉搜索树 :它是一棵空树或它的左右两个子树的高度差的绝对值不超过<=1,并且左右两个子树都是一棵平衡二叉树。
2. 存储方式
链式存储(指针链表)(常用) :把各个地址的节点串联起来 ---节点元素 左指针 右指针
顺序存储(数组):元素顺序存储且空间连续分布
父节点数组下标为i,左孩子是i*2+1 右孩子是i*2+2
3.遍历方式
- 深度优先遍历:先往深走,遇到叶子节点再往回走。(栈)
- 前序遍历(递归法,迭代法)(中左右)(从上到下)
- 中序遍历(递归法,迭代法)(左中右)(从左到右)
- 后序遍历(递归法,迭代法)(左右中)(从下到上) 前中后是表示中在哪个位置
- 广度优先遍历:一层一层的去遍历。(队列)
- 层次遍历(迭代法)
4.定义(链表==二叉树)
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};//要学会定义二叉树(手写)
二叉树是一个基础的数据结构,众多数据结构的基石
二:栈(stack)与队列基础知识(还不是很详细,很懂)
栈和队列是STL(C++标准库)里面的数据结构
栈 先进后出 队列 先进先出
栈:在SGI STL,如果没有指定底层实现,默认deque为缺省情况下栈的底层结构,deque是一个双向队列,只要封住一段,开通另一端就实现了栈的逻辑。
std::stack<int,std::vector<int>> third;
//用vector为底层容器的栈
std::queue<int,std::list<int> third;
//用list为底层容器的队列
(ps:由于二叉树的内容涉及到栈所以这里先做出基础知识的补充,后期决定先学栈与队列-> 二叉树->回溯)
三:二叉树递归遍历
1.确定递归函数的参数和返回值
void traversal(TreeNode* cur,vector<int>& vec)
2.确定终止条件
if(cur==NULL) return ;
3.确定单层循环的逻辑
//前序列
vec.push_back(cur->val);//中
traversal(cur->left,vec);//左
traveral(cur->right,vec);//右
//中序列
traveral(cur->left,vec);//左
vec.push_back(cur->val);//中
traveral(cur->right,vec);//右
//后排序
traveral(cur->left,vec)//左
traveral(cur->right,vec);//右
vec.push_back(cur->val);//中
整体代码(前排序)
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;
}
};