102.二叉树的层序遍历
思路:使用队列
先把根节点放到队列里面,然后记录队列的大小,这里记录的大小实际上是每一层节点的个数,后面还需要通过该大小,将该层的节点进行弹出,在弹出的时候,将弹出节点的值存到 resultSmall 里面,然后判断该节点的左右孩子是否为空,不为空,继续加到队列里面,等一层的遍历结束,将resultSmall 存到result里面。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> queue1;
vector<vector<int>> result;
if (root != NULL) {
queue1.push(root);
} else return result;
while (!queue1.empty()) {
TreeNode* node;
int size;
size = queue1.size();
vector<int> resultSmall;
while (size--) {
node = queue1.front();
queue1.pop();
resultSmall.push_back(node->val);
if (node->left) {
queue1.push(node->left);
}
if (node->right) {
queue1.push(node->right);
}
}
result.push_back(resultSmall);
}
return result;
}
};
226.翻转二叉树
相当于把二叉树沿着 x = 0 对称轴进行翻转过来
该题目用递归的前序和后序是最合适的。
对于前序:中左右,先交换左右孩子节点,然后反转左子树,再反转右子树
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;
}
};
101.对称二叉树
这道题目只能使用后序遍历:左右中
什么情况下只能使用后序遍历:就是当需 要收集孩子的信息,向上一层返回,这道题目实际上是考察同时处理两个二叉树的遍历过程,同时比较两个二叉树里面对应的节点的情况。
当根节点的左右节点的值相等时,才会去比较左右节点的左右孩子,是否相等,若左节点->左孩子 与 右节点->右孩子相等, 左节点->右孩子 与 右节点->左孩子相等,则左右节点 此时称之为真正的相等。这样就可以和左右中的顺序对应起来。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
return compare(root->left, root->right);
}
bool compare(TreeNode* left, TreeNode* right) {
if (left == NULL && right != NULL) return false;
if (left != NULL && right == NULL) return false;
if (left == NULL && right == NULL) return true;
if ( left->val != right->val) return false;
bool outside = compare(left->left, right->right);
bool inside = compare(left->right, right->left);
bool isSame = outside && inside;
return isSame;
}
};