文章目录
1. 二叉树
(1) 二叉树理论知识
(2)常见的二叉树
满二叉树
完全二叉树
二叉搜索树
平衡二叉搜索树
(C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_map底层实现是哈希表。)
(2)二叉树的定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
2. 二叉树的层序遍历
(1)解析
Leetcode102 二叉树的层序遍历
(2)思路
利用que.size()来获得每一层
(3)代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> resvec;
queue<TreeNode *> nodeque;
if(root != NULL)
nodeque.push(root);
while(!nodeque.empty())
{
vector<int> res;
int size = nodeque.size();
for(int i = 0; i < size; ++i)
{
TreeNode *node = nodeque.front();
nodeque.pop();
res.push_back(node->val);
if(node->left != NULL)
nodeque.push(node->left);
if(node->right != NULL)
nodeque.push(node->right);
}
resvec.push_back(res);
}
return resvec;
}
};
(4)总结
无
3. 翻转二叉树
(1)解析
Leetcode226 二叉树的翻转
(2)思路
(3)代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == NULL)
return NULL;
TreeNode *leftnode = root->left;
root->left = invertTree(root->right);
root->right = invertTree(leftnode);
return root;
}
};
(4)总结
不用swap
4. 对称二叉树
Leetcode101 对称二叉树
(2)思路
根据二叉树对称的结构来设计逻辑
(3)代码
/**
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool comapare(TreeNode* left, TreeNode* right)
{
if(left == NULL && right != NULL)
return false;
else if(left != NULL && right == NULL)
return false;
else if(left == NULL && right == NULL)
return true;
else if(left->val != right->val)
return false;
bool outside = comapare(left->left, right->right);
bool inside = comapare(left->right, right->left);
return outside && inside;
}
bool isSymmetric(TreeNode* root) {
if(root == NULL)
return NULL;
return comapare(root->left, root->right);
}
};