一、LeetCode 102. 层次遍历
题目链接/文章讲解/视频讲解: https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html状态:已解决
1.思路
二叉树的广度优先搜索实际就是一层一层地去遍历,直接使用指针或数组很难实现这种遍历方式,因为一般定义的树结构没有指向自己的兄弟节点(也可以这么定义TreeNode),因此我们需要借助一个辅助数据结构——队列。队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
2.代码实现
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
vector<vector<int>> result;
if(root == NULL) return result;
q.push(root);
while(!q.empty()){
int size = q.size();
vector<int> v;
while(size--){
TreeNode * node = q.front();
q.pop();
v.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
result.push_back(v);
}
return result;
}
};
二、226.翻转二叉树
状态:已解决
1.思路
这道题思路还是很好理解的,就是将左右孩子交换一下即可。关键是在于遍历顺序,即三种遍历顺序我们应该选哪种呢?其实,能够将左右子树都实现交换操作的遍历顺序都可以,前序、后序、层次遍历都可以,唯独中序遍历不行,因为中序遍历将左子树处理好后,回到中间节点,交换了左右子树,又开始遍历右子树,而此时的右子树恰好是交换前的左子树,因此相当于两次操作的都是同一个子树,故不可以。
2.代码实现(以递归为例)
class Solution {
public:
TreeNode* reverseTreeNode(TreeNode* node){
if(node == NULL) return node;
swap(node->left,node->right);
reverseTreeNode(node->left);
reverseTreeNode(node->right);
return node;
}
TreeNode* invertTree(TreeNode* root) {
return reverseTreeNode(root);
}
};
可以直接将reverseTreeNode函数内的内容写到InvertTree里面,让invertTree函数直接作为递归函数。
三、101.对称二叉树
状态:已解决
1.思路
这道题很容易让人想到左子树和右子树镜像对称着去遍历,那么以哪种遍历方式为基准呢?其实只能后序遍历:因为我们需要将左右子树的对称节点一一对比完后,将对比信息返回给中间结点,由中间节点判断二者是否对称。清楚思路了,就直接套深度优先搜索的公式了。
2.代码实现
左子树相当于左右中顺序,右子树相当于右左中顺序。
class Solution {
public:
bool compareTree(TreeNode* leftNode,TreeNode* rightNode){
if(leftNode == NULL && rightNode != NULL) return false;
else if(leftNode != NULL && rightNode == NULL) return false;
else if(leftNode == NULL && rightNode == NULL) return true;
else if(leftNode->val != rightNode->val) return false;
else{
bool inside = compareTree(leftNode->right,rightNode->left);//比较内侧
bool outside = compareTree(leftNode->left,rightNode->right);//比较外侧
return inside && outside;
}
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return compareTree(root->left,root->right);
}
};