LeetCode 102.二叉树的层序遍历
题目链接:LeetCode 102.二叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if(root != NULL)
que.push(root);
vector<vector<int>> res;
while(!que.empty())
{
int size = que.size();
vector<int> vec;
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;
}
};
思路:借助队列,如果根节点不为空,将每一行存入队列中,当队列不为空时,将队列中的元素排除。并将其值存入结果集中。当该层元素排除结束后,判断左右子节点是否为空,不为空则继续将其加入队列中,直至所有元素被排除完成。
小结:在排除元素时,记录队列中元素个数,通过size来控制排除的元素个数。
LeetCode 226. 翻转二叉树
题目链接:LeetCode 226. 翻转二叉树
前序遍历:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == NULL)
return root;
swap(root -> left,root -> right);
invertTree(root -> left);
invertTree(root -> right);
return root;
}
};
思路:通过递归法中的前序遍历,先判断节点是否为空,之后交换左右节点再向下进行遍历即可。
小结:该题通过改变代码执行顺序可以分别用前序遍历和后序遍历来完成交换。但是因中序遍历中,左节点在交换后变为右节点,而接下来执行的是右节点的交换(即原左节点),并没有对原右节点进行交换。故需将代码改为两个invertTree(root -> left)。
LeetCode 101. 对称二叉树
题目链接:LeetCode 101. 对称二叉树
后序遍历:
class Solution {
public:
bool compare(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 = compare(left -> left, right -> right);
bool inside = compare(left -> right, right -> left);
bool same = inside && outside;
return same;
}
bool isSymmetric(TreeNode* root) {
if(root == NULL)
return true;
return compare(root -> left, root -> right);
}
};
思路:借助后续遍历来实现的判断函数,通过递归法进行判断,若存在以下几种情况,则为不对称:1)左右节点只有1边为空,2)左右节点均不为空,但其值不相等;终止判断。之后继续判断,先判断外侧是否相等,再判断内测是否相等,再判断他们是否均相等;当左右节点均为空时,也终止判断,其为对称二叉树。
小结:判断二叉树是否对称,关键是判断左右子树是否相等;而之所以只能用后续判断,是因为先要判断左右子节点是否相等才能继续判断他们的根节点。