101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
题意
判断二叉树是否轴对称
思路
递归判断左右子节点,如果其中一个子节点不存在或者两个子节点的值不相等则不是轴对称,若相等,则继续判断p的左节点和q右节点以及p的右节点和q的左节点是否相同。
代码
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return dfs(root->left, root->right);
}
bool dfs(TreeNode* p, TreeNode* q){
if(!p && !q) return true;
if(!p || !q || p->val != q->val) return false;
return dfs(p->left, q->right) && dfs(p->right,q->left);
}
};
543. 二叉树的直径
给你一棵二叉树的根节点,返回该树的直径 。
二叉树的直径是指树中任意两个节点之间最长路径的长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的长度由它们之间边数表示。
题意
求二叉树的直径(两点之间最长)
思路
遍历每个点,求其左右子树中的最长距离之和的最大值即为直径。每个节点的最长距离为左右子节点的距离最大值+1;
代码
class Solution {
public:
int ans = 0;
int diameterOfBinaryTree(TreeNode* root) {
dfs(root);
return ans;
}
int dfs(TreeNode* root){
if(!root) return 0;
int left = dfs(root->left), right = dfs(root->right);
ans = max(ans, left + right);
return max(left, right) + 1;
}
};
102. 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
题意
求二叉树的层序遍历
思路
利用bfs来进行搜索,创建一个队列q,首先把根节点放入队列中,当队列不空,依次取出队列中的元素,然后把取出元素的左右儿子加入队列。
代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> q;
if(root) q.push(root);
while(q.size()){
vector<int> level;
int len = q.size();
while(len--){
auto t = q.front();
q.pop();
level.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
res.push_back(level);
}
return res;
}
};