目录
101 对称二叉树
题目
题解
完整代码
102 二叉树的层序遍历
题目
题解
完整代码
103 二叉树的锯齿形层次遍历
题目
题解
完整代码
104 二叉树的最大深度
题目
题解
完整代码
105 从前序与中序遍历构建二叉树
题目
题解
完整代码
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归(遇到树的问题:优先考虑递归,其次考虑迭代)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
bool isSymmetric(TreeNode* l, TreeNode *r) {
if(l == nullptr && r == nullptr) {
return true;
} else if(l == nullptr || r == nullptr) {
return false;
} else if(l->val != r->val) {
return false;
}
return isSymmetric(l->left, r->right) && isSymmetric(l->right, r->left);
}
public:
bool isSymmetric(TreeNode* root) {
if(root == nullptr) {
return true;
}
return isSymmetric(root->left, root->right);
}
};
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],3
/ \
9 20
/ \
15 7
返回其层次遍历结果:[
[3],
[9,20],
[15,7]
]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:使用两个队列
方法二:使用一个队列
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// 方法一:使用两个队列
/*
vector> levelOrder(TreeNode* root) {
if(root == nullptr) {
return {};
}
// 层序遍历,使用栈来实现
vector> result;
queue s;
s.push(root);
while(!s.empty()) {
queue temp;
vector arr;
while(!s.empty()) {
TreeNode* node = s.front();
s.pop();
arr.push_back(node->val);
if(node->left != nullptr) {
temp.push(node->left);
}
if(node->right != nullptr) {
temp.push(node->right);
}
}
s = temp;
result.push_back(arr);
}
return result;
}
*/
// 方法二:使用一个队列
vector> levelOrder(TreeNode* root) {
if(root == nullptr) {
return {};
}
vector> result;
queue que;
que.push(root);
while(!que.empty()) {
int currentQueSize = que.size();
vector tmp;
for(int i = 0; i < currentQueSize; i++) {
TreeNode* node = que.front();
que.pop();
tmp.push_back(node->val);
if(node->left != nullptr) {
que.push(node->left);
}
if(node->right != nullptr) {
que.push(node->right);
}
}
result.push_back(tmp);
}
return result;
}
};
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:[
[3],
[20,9],
[15,7]
]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
迭代
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector> zigzagLevelOrder(TreeNode* root) {
if(root == nullptr) {
return {};
}
vector> result;
queue que;
que.push(root);
int order = 0;
while(!que.empty()) {
int currentQueSize = que.size();
vector tmp;
for(int i = 0; i < currentQueSize; i++) {
TreeNode* node = que.front();
que.pop();
tmp.push_back(node->val);
if(node->left != nullptr) {
que.push(node->left);
}
if(node->right != nullptr) {
que.push(node->right);
}
}
if(order == 1) {
reverse(tmp.begin(), tmp.end());
order = 0;
} else {
order = 1;
}
result.push_back(tmp);
}
return result;
}
};
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == nullptr) {
return 0;
}
return maxDepth(root, 1);
}
int maxDepth(TreeNode* root, int depth) {
if(root == nullptr) {
return depth - 1;
}
return max(maxDepth(root->left, depth + 1), maxDepth(root->right, depth + 1));
}
};
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:3
/ \
9 20
/ \
15 7来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
map idx;
public:
TreeNode* buildTreeImp(vector& preorder, vector& inorder, int leftPreIdx,
int rightPreIdx, int leftInIdx, int rightInIdx)
{
if(leftPreIdx > rightPreIdx) {
return nullptr;
}
int rootIdx = leftPreIdx;
int inRootIdx = idx[preorder[rootIdx]];
int length = inRootIdx - leftInIdx;
TreeNode* root = new TreeNode(preorder[rootIdx]);
root->left = buildTreeImp(preorder, inorder, leftPreIdx + 1, leftPreIdx + length, leftInIdx, inRootIdx - 1);
root->right = buildTreeImp(preorder, inorder, leftPreIdx + length + 1, rightPreIdx, inRootIdx + 1, rightInIdx);
return root;
}
TreeNode* buildTree(vector& preorder, vector& inorder) {
int n = preorder.size(); // 二叉树的节点数目
// 构建中序遍历节点值到索引的映射
for(int i = 0; i < n; ++i) {
idx[inorder[i]] = i;
}
return buildTreeImp(preorder, inorder, 0, n - 1, 0, n - 1);
}
};