Day6---二叉树基础(上)
二叉树种类
- 满二叉树--------特点:深度为K,有2^k-1个节点
- 完全二叉树------特点:1.只能是最底层可能没填满;2.只可能是左右都没或者“左在右空”,其余情况都不是
- 二叉搜索树-------特点:左子树所有节点值都小于根节点,右子树则都大
- 平衡二叉树--------特点:左右子树的高度差不超过1
二叉树的遍历方式
主要可分为:
1.深度优先遍历(DFS)---------一条路走到底再返回:可分为前序、中序和后序
2.广度优先遍历(BFS)------一层一层走完(层次遍历)
###前序遍历
前序遍历—(中左右)
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;
}
};
中序遍历—(左中右)
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
vec.push_back(cur->val); // 中
traversal(cur->right, vec); // 右
}
vector<int> midorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
后序遍历—(左右中)
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
vec.push_back(cur->val); // 中
}
vector<int> lastorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
层次遍历—(利用队列实现)
//层序遍历;需要依赖队列实现
vector<vector<int>> levelOrder(TreeNode* root)
{
//1.先创建一个队列,存储根节点
queue<TreeNode*> que;
if(root!=NULL) que.push(root);
vector<vector<int>> res;
//2.while循环,进行树的遍历
while(!que.empty())
{
int size=que.size();
//3.创建一个容器,存放每一层的结果
vector<int> vec;//存储每一层的结果
//4.循环,输出当前一层的结果;并存储下一层 的节点
for(int i=0;i<size;i++)
{
TreeNode *node=que.front();
que.pop();
vec.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
res.push_back(vec);
}
return res;
}