Day15 树
力扣相关例题
1、层序遍历
102. 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 :
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
//定义指针队列
queue<TreeNode*> que;
//定义二维数组
vector<vector<int>> result;
//如果根节点不为空,则根节点入队列
if (root != NULL) {
que.push(root);
}
while (!que.empty()) {
vector<int> vec;
//记录一层有几个元素
int size = que.size();
//逐次将一层中的元素出队列
while (size--) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if (node->left != NULL) {
que.push(node->left);
}
if (node->right != NULL) {
que.push(node->right);
}
}
result.push_back(vec);
}
return result;
}
};
107. 二叉树的层序遍历 II
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例 :
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
//定义指针队列
queue<TreeNode*> que;
//定义二维数组
vector<vector<int>> result;
//如果根节点不为空,则根节点入队列
if (root != NULL) {
que.push(root);
}
while (!que.empty()) {
vector<int> vec;
//记录一层有几个元素
int size = que.size();
//逐次将一层中的元素出队列
while (size--) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if (node->left != NULL) {
que.push(node->left);
}
if (node->right != NULL) {
que.push(node->right);
}
}
result.push_back(vec);
}
//翻转数组
reverse(result.begin(), result.end());
return result;
}
};
199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 :
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
//定义指针队列
queue<TreeNode*> que;
vector<int> result;
//如果根节点不为空,则根节点入队列
if (root != NULL) {
que.push(root);
}
while (!que.empty()) {
int size = que.size();
//逐次将一层中的最后元素出队列
while (size--) {
//这边while循环的size,条件通过后size马上减1
TreeNode* node = que.front();
que.pop();
if (size == 0) {
result.push_back(node->val);
}
if (node->left != NULL) {
que.push(node->left);
}
if (node->right != NULL) {
que.push(node->right);
}
}
}
return result;
}
};
2、翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 :
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
(1)递归法
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) {
return root;
}
//交换左右孩子
//前序遍历 中左右
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
/*
//后序遍历 左右中
invertTree(root->left);
invertTree(root->right);
swap(root->left, root->right);
*/
/*
//中序遍历 左中右
invertTree(root->left);
swap(root->left, root->right);
invertTree(root->left);这里要特别注意是递归左子树,因为上一步已经调换左右
*/
return root;
}
};
(2)迭代法
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
//前序迭代(后序中序的代码差不多,与递归一样只要调换顺序更改小细节即可)
if (root == NULL) {
return root;
}
stack<TreeNode*> sta;
sta.push(root);
while(!sta.empty()) {
TreeNode* node = sta.top();
sta.pop();
swap(node->left, node->right);
if (node->right != NULL) {
sta.push(node->right);
}
if (node->left != NULL) {
sta.push(node->left);
}
}
return root;
}
};
101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 :
输入:root = [1,2,2,3,4,4,3]
输出:true
(1)递归法
一定要仔细理解,不然就是一如递归深似海
class Solution {
public:
bool compareTree(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 inside = compareTree(left->left, right->right);
//内侧
bool outside = compareTree(left->right, right->left);
//判断内侧外侧是否相等
bool result = inside && outside;
return result;
}
bool isSymmetric(TreeNode* root) {
if (root == NULL) {
return true;
}
return compareTree(root->left, root->right);
}
};
(2)迭代法
队列
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root == NULL) {
return true;
}
queue<TreeNode*> que;
que.push(root->left);
que.push(root->right);
while (!que.empty()) {
TreeNode* left = que.front();
que.pop();
TreeNode* right = que.front();
que.pop();
//两个都为空
if (!left && !right) {
continue;
}
//
if (!left || !right || (left->val != right->val)) {
return false;
}
que.push(left->left);
que.push(right->right);
que.push(left->right);
que.push(right->left);
}
return true;
}
};
今天例题太多了,写不完【捂脸】
后面休息日补回来!