1.层序遍历
1.层序遍历——广度优先遍历,需要借助队列来实现。
2.用队列去保存每层遍历过的元素。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
//迭代法
queue<TreeNode*> que;
vector<vector<int>> result;
if(root == NULL) return result;
que.push(root);
while(!que.empty()){
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
int size = que.size(); //特别注意!
vector<int> vec;
while(size--){
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);
}
result.push_back(vec);
}
return result;
}
};
二叉树的每一层元素放在一个数组之中,返回的是一个二维数组。
2.翻转二叉树
226.翻转二叉树
思路:
1.只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果。
2.这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次。
3.二叉树的题目一定要确定好 结点的遍历顺序!!!(遍历顺序很重要)
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;
}
};
3. 小结
1.红黑树就是一种二叉平衡搜索树,这两个树不是独立的,所以C++中map、multimap、set、multiset的底层实现机制是二叉平衡搜索树,再具体一点是红黑树。
这两个树并非独立的。
4.对称二叉树
101. 对称二叉树
思路:
1.对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。
2.比较的是两个子树的里侧和外侧的元素是否相等。
3.同为内侧的结点进行比较,同为外侧的结点进行比较。
4.遍历顺序:本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。
递归法:
class Solution {
public:
//递归三部曲
bool campare(TreeNode* left,TreeNode *right){
if(left == NULL && right == NULL) return true;
else if(left == NULL && right != NULL) return false;
else if(left != NULL && right == NULL) return false;
else if(left -> val != right -> val) return false;
//只能后序!(左右中)
bool inside = campare(left -> left,right -> right);
bool outside = campare(left -> right,right -> left);
bool result = inside && outside;
return result;
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
bool isSame = campare(root -> left,root -> right);
return isSame;
}
};
1.判断是否为对称二叉树,其实就是判断左右子树是否可以翻转,左右子树是否对称。
2.理解遍历顺序。