剑指offer67题-No59.按之字形顺序打印二叉树
二叉树的层序遍历,特判版。特判还是比较难的,主要是需要用到tmp.insert(tmp.begin(), x->val);实现从右到左打印 class Solution {public:vector > Print(TreeNode* pRoot) { if (pRoot == nullptr) return {}; vector<ve…
|
|
剑指offer67题-No58.对称的二叉树
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称) bool dfs(TreeNode* p1, TreeNode* p2){ // 都为nullptr 必对称 if(p1 == nullptr && p2 == nullptr) return true; // 不对称 if(p1 == nullptr || p2 == nul…
|
|
剑指offer67题-No57.二叉树的下一个节点
简单的思路就是递归中序遍历一遍,存在vector里,然后输出。 通常情况下,中序遍历不可能有O1空间复杂度方法,非递归算法也要用栈来辅助。 三种遍历树的非递归算法总结,可以参考blog:二叉树遍历-非递归算法 - 翁德彪 - 博客园 此处贴一个借助栈的中序遍历非递归算法: void InorderTraverse(BiTree T,Stack *s…
|
|
剑指offer67题-No56.删除链表中的重复节点
用哈希的方法比较简单,想想直接遍历的方法。 遍历链表,每次比较相邻两个节点,如果遇到了两个相邻节点相同,则新开内循环将这一段所有的相同都遍历过去。 在这一连串相同的节点前的节点,直接连上后续第一个不相同值的节点。 class Solution { public: ListNode* deleteDuplication(ListNode* pHead…
|
|
剑指offer67题-No55.链表中的入口节点
双指针算法 快慢指针,指针相遇的时候就是入口。证明如下: 设快指针的速度是慢指针的两倍,环之前有m个节点,环内有c个节点。当慢指针走了a步且两指针相遇时,快指针显然走了a+nc步(n表示快指针的绕环周期)。 再由先前的速度定义,有:2a = a+nc,即a = nc,说明慢指针此时,刚好走了n个环周期,只需要再走m步,就可以到达入口点了。再重置一个…
|
|
剑指offer67题-No54.字符流中第一个不重复的字符
字符串处理 哈希表。 #include <unordered_map> class Solution { public: //Insert one char from stringstream string s; unordered_map<char, int> mp; void Insert(char ch) { s += ch; m…
|
|
剑指offer67题-No53.表示数值的字符串
字符串处理 leetcode上精简的题解方法。 .出现正确情况:只出现一次,且在e的前面 e出现正确情况:只出现一次,且出现前有数字 +和-出现正确情况:只能在开头和e后一位 class Solution { public: bool isDigital(char x){ return x >= '0' && x <= '9'…
|
|
剑指offer67题-No52.正则表达式匹配
字符串处理 没想到是动态规划题,感觉特别难 LCR 137. 模糊搜索验证 - 力扣(LeetCode) 法1:DP 用f[i][j]表示s的前i个字符与p的前j个字符是否能匹配。考虑情况: p的第j个字符是小写字符:f[i][j] = f[i-1][j-1] (if s[i] = p[j])f[i][j] = false (if s[i] ≠ p…
|
|