摘要:
将根节点插入队列中; 创建一个新队列,用来按顺序保存下一层的所有子节点; 对于当前队列中的所有节点,按顺序依次将儿子插入新队列; 按从左到右、从右到左的顺序交替保存队列中节点的值; 重复步骤2-4,直到队列为空为止。 /** * Definition for a binary tree node. 阅读全文
摘要:
我们可以用广度优先搜索解决这个问题。 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一 阅读全文
摘要:
BFS。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NUL 阅读全文
摘要:
思路 所有的元素一定是按顺序 push 进去的,重要的是怎么 pop 出来? 假设当前栈顶元素值为 2,同时对应的 popped 序列中下一个要 pop 的值也为 2,那就必须立刻把这个值 pop 出来。因为之后的 push 都会让栈顶元素变成不同于 2 的其他值,这样再 pop 出来的数 popp 阅读全文
摘要:
单调栈。 class MinStack { public: stack<int> stk, minstk; /** initialize your data structure here. */ MinStack() { } void push(int x) { stk.push(x); if (m 阅读全文
摘要:
可以模拟螺旋矩阵的路径。初始位置是矩阵的左上角,初始方向是向右,当路径超出界限或者进入之前访问过的位置时,顺时针旋转,进入下一个方向。 判断路径是否进入之前访问过的位置需要使用一个与输入矩阵大小相同的辅助矩阵 visited,其中的每个元素表示该位置是否被访问过。当一个元素被访问时,将 visite 阅读全文
摘要:
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。 因此,该问题可以转化为:两个树在什么情况下互为镜像? 如果同时满足下面的条件,两个树互为镜像: 它们的两个根结点具有相同的值 每个树的右子树都与另一个树的左子树镜像对称 我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树 阅读全文
摘要:
我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转得到镜像。 如果当前遍历到的节点 root 的左右两棵子树都已经翻转得到镜像,那么我们只需要交换两棵子树的位置,即可得到以 root 为根节点的整棵子树的镜像。 /** * Definition for a binary tree node 阅读全文
摘要:
代码分为两个部分: 遍历树A中的所有非空节点R; 判断树A中以R为根节点的子树是不是包含和树B一样的结构,且我们从根节点开始匹配; 对于第一部分,我们直接递归遍历树A即可,遇到非空节点后,就进行第二部分的判断。 对于第二部分,我们同时从根节点开始遍历两棵子树: 如果树B中的节点为空,则表示当前分支是 阅读全文
摘要:
二路归并。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ clas 阅读全文
摘要:
快慢指针。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ clas 阅读全文
摘要:
双指针。 class Solution { public: vector<int> exchange(vector<int>& nums) { int n = nums.size(); int i = 0, j = n - 1; while (i < j) { while (i < j && num 阅读全文