144.二叉树的前序遍历
这样直接递归是不行的,因为数组res没有传递。
重写一个方法: 注意传的是数组的引用引用引用&啊啊
方法二:用迭代的方式实现方法一的递归函数,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈。
而在迭代的时候需要显式地将这个栈模拟出来,其余的实现与细节都相同。
vector<int>preorderTraversal(TreeNode*root){
vector<int>res;
if(root==nullptr){
return res;
}
stack<TreeNode*>stk;
TreeNode*node=root;
while(!stk.empty()||node!=nullptr){
while(node!=nullptr){
res.emplace_back(node->val);
stk.emplace(node);
node=node->left;
}
node=stk.top();
stk.pop();
node=node->right;
}
return res;
}
101. 对称二叉树
一个树的左子树和右子树镜像对称
两个指针的方法来遍历这棵树,p 指针和 q指针一开始都指向这棵树的根。
随后 p右移时,q左移,p 左移时,q 右移。每次检查当前 p和 q 节点的值是否相等,如果相等再判断左右子树是否对称。
class Solution {
public:
bool check(TreeNode *p, TreeNode *q) {
if (!p && !q) return true;
if (!p || !q) return false;
return p->val == q->val && check(p->left, q->right) && check(p->right, q->left);
}
bool isSymmetric(TreeNode* root) {
return check(root, root);
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/symmetric-tree/solution/dui-cheng-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
102. 二叉树的层次遍历(怎么区分一层?)
方法一:广度优先遍历
- 用一个二元组
(node, level)
来表示状态,它表示某个节点和它所在的层数。 - 每个新进队列的节点的
level
值都是父亲节点的level
值加一。 - 最后根据每个点的 level 对点进行分类,分类的时候可以利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值。广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可。
考虑如何优化空间开销:如何不用哈希映射,并且只用一个变量 node
表示状态,实现这个功能呢?
修改广度优先搜索:首先根元素入队,当队列不为空的时候,求当前队列的长度 si,依次从队列中取 si个元素进行拓展,然后进入下一次迭代。
普通广度优先搜索每次只取一个元素拓展,而这里每次取 si 个元素。在上述过程中的第 i 次迭代就得到了二叉树的第 i 层的 si个元素。
vector::back() 是 "vector" 头文件的库函数,用于访问向量的最后一个元素,返回对向量最后一个元素的引用。
- 记录每次队列的长度,即每层结点的个数。用于循环。
- 二维数组,每个元素是一层的数的数组,可以获得再push_back;
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret;
if (!root) {
return ret;
}
queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return ret;
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-xu-bian-li-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
104.二叉树的最大深度
深度优先搜索(递归)DFS:
左子树和右子树的最大深度 l和 r,那么该二叉树的最大深度即为 max(l,r)+1。
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/solution/er-cha-shu-de-zui-da-shen-du-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。