代码随想录算法训练营day13| 二叉树层序遍历 226 翻转二叉树 101 对称二叉树
二叉树的层序遍历
LeetCode 102 二叉树的层序遍历
题目链接: 102. 二叉树的层序遍历
class Solution {
public:
vector levelOrder(TreeNode* root) {
queue que;
if(root != NULL) que.push(root);
vector result;
while(!que.empty()) {
int size = que.size();
vector vec;
//此处需要固定size大小,que.size()是不断变化的
for(int i = 0; i
public:
void order(TreeNode* cur, vector& result, int depth) {
if(cur == nullptr) return;
if(result.size() == depth) result.push_back(vector()); //递归终止条件
result[depth].push_back(cur->val);
order(cur->left, result, depth+1);
order(cur->right, result, depth+1);
}
vector levelOrder(TreeNode* root) {
vector result;
int depth = 0;
order(root, result, depth);
return result;
}
};
本题小结:层序遍历有两种方式,一种是利用队列先进先出的方式对每层进行遍历,第二种是递归法。
LeetCode 226 翻转二叉树
题目链接: 226.翻转二叉树
class Solution{
public:
TreeNode* invertTree(TressNode* root) { //确定递归函数参数和返回值
if(root == NULL) return root; //确定中止条件
//确定单层递归逻辑(此处为前序遍历)
swap(root->left, root->right); //中
invertTree(root->left); //左
invertTree(root->right); //右
return root;
}
};
本题小结:此题需要注意在翻转遍历顺序的时候需要注意不能采用中序遍历,因为可能会因为交换导致一边节点顺序没更换,另一边更换了两次。
LeetCode 101 对称二叉树
题目链接: 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); //左子树:左 vs 右子树:右
bool inside = compare(left->right, right->left); //左子树:右 vs 右子树: 左
bool isSame = outside && compare;
return isSame;
}
};
本题小结:此题的意思是判断根节点的左右子树,需要同时遍历两棵树,且遍历顺序只能是后序遍历,因为涉及到遍历过程中需要判断左子树的“左右中”和右子树的“右左中”是否相同。
|