剑指offer67题-No26.二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求:空间复杂度O(1)(即在原树上操作),时间复杂度 O(n^2)要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继 二叉搜索树:左<根<右 法1:中序遍历将二叉搜索树进行中序遍历可以得到由小到大的…
|
|
剑指offer67题-No24.二叉树中和为某一值的路径(二)
递归,用一个vector存储中间的path路径。 #include <vector> class Solution { public: // 一个存放最后结果,一个存放临时结果 vector<vector<int>> res; vector<int> path; void dfs(TreeNode* root, int ta…
|
|
剑指offer67题-No23.二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。数据范围: 节点数量 0≤n≤10000≤n≤1000 ,节点上的值满足 1≤val≤1051≤val≤105 ,保证节点上的值各不相同 要求:空间复杂度 O(n) ,时间时间复杂度 O(n2) …
|
|
剑指offer67题-No22.从上往下打印二叉树
层次遍历 #include <vector> class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { if(root == nullptr) return {}; std::queue<TreeNode*> Q; std::vector…
|
|
剑指offer67题-No18.二叉树镜像
递归 class Solution { public: TreeNode* Mirror(TreeNode* pRoot) { //空树返回 if(pRoot == NULL) return NULL; //先递归子树 TreeNode* left = Mirror(pRoot->left); TreeNode* right = Mirror(pR…
|
|
剑指offer67题-No17.树的子结构
树的题目,一般用递归来写 双重递归 class Solution { public: bool isSubtree(TreeNode* p1, TreeNode* p2) { if (p2 == nullptr) return true; // 树 B 已匹配完 if (p1 == nullptr) return false; // 树 A 已空但…
|
|
剑指offer67题-No4.重建二叉树
剑指offer第三题:从头到尾打印链表,比较简单。代码如下: #include <vector> class Solution { public: vector<int> printListFromTailToHead(ListNode* head) { if(head == nullptr) return vector<int>…
|
|