今天主要学了一下二叉树的层次遍历以及翻转二叉树和对称二叉树。
直入主题先是层次遍历,实质就是遍历每一层的元素,对于储存的话就可以用队列来储存。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> st;
vector<vector<int>> result;
if (root != NULL) st.push(root);
while (!st.empty()) {
int size = st.size();
vector<int> vec; //vector要放在while循环的里面,不然后面的数组总会重复前面的数值
while (size--) {
TreeNode* q = st.front();
st.pop();
vec.push_back(q->val);
if (q->left) st.push(q->left);
if (q->right) st.push(q->right);
}
result.push_back(vec);
}
return result;
}
};
做的时候还忘记了vector怎么定义二维数组了,又巩固一遍
vector<vector<int> > array(m) 二维数组的建立m就是多少行
对于层次遍历的话我觉得唯一需要注意的就是对于vector函数和size的定义要放在的第一个大循环里不然的话对于后面result保存的值就会出现错误。
对于力扣上有两类层次遍历的题,一种是从上到下遍历一种是从下到上遍历,对于从下往上便利的话其本质和上述代码差不多,对于最后的输出的话就转置一下代码就行了。
c++的话用reverse(result.begin(), result.end()); 即可但是要注意对于一个二维数组,使用reverse函数反转的话,只会对每一行的元素进行前后翻转,而不会对行与行之间的顺序进行改变。对于二维数组他不会转化每一行里的元素。
对于翻转二叉树的话,用先序和后序遍历都好解决,但是对于中序来说可能要复杂一点,需要转一个弯。
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;
}
};
如果用中序的话无非就是在遍历完左子树后,翻转后在遍历一次左子树,此时的左子树就是翻转前的右子树,如若继续遍历右子树拿什么都没遍历到。
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 result=outside&&inside;
return result;
}
对称二叉树,其本质就是寻找递归点,对于外部的就是左子树的左子树和右子树的右子树进行比较,对于内部的就是左子树的右子树和右子树的左子树进行比较若两个都为true即可输出。
对深度和高度复习了下
深度:叶子节点到根节点的距离一般用先序遍历
高度:根节点到叶子节点的距离一般用后序遍历
在力扣上求最大深度的题也可以用层次遍历,只需要在每次二维数组进值得时候设立一个量++即可。