传送门
nowcoder
leetcode
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
数据范围:输入二叉树的节点数 0 <= n <= 1000
,二叉树中每个节点的值0 <= val <= 1000
要求:空间复杂度 O(1),时间复杂度 O(n)
C++ 代码 - nowcoder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
class Solution { public: TreeNode* Convert(TreeNode* root) { if (root == nullptr) return nullptr;
root = inOrder(root); while (root->left) { root = root->left; } return root; }
TreeNode* inOrder(TreeNode* root) { if (root == nullptr) return root;
if (root->left) { TreeNode* leftNode = inOrder(root->left); while (leftNode->right) { leftNode = leftNode->right; } leftNode->right = root; root->left = leftNode; } if (root->right) { TreeNode* rightNode = inOrder(root->right); while (rightNode->left) { rightNode = rightNode->left; } rightNode->left = root; root->right = rightNode; }
return root; } };
class Solution { public: TreeNode* Convert(TreeNode* root) { if (root == nullptr) return nullptr;
TreeNode *head = nullptr, *prev = nullptr; stack<TreeNode*> stk; while (!stk.empty() || root) { while (root) { stk.push(root); root = root->left; } root = stk.top(); stk.pop(); if (!prev) { head = root; } else { prev->right = root; root->left = prev; } prev = root; root = root->right; }
return head; } };
|
C++ 代码 - leetcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
class Solution { public: Node* treeToDoublyList(Node* root) { if (!root) return root; dfs(root); head->left = tail; tail->right = head; return head; }
void dfs(Node* node) { if (!node) return;
dfs(node->left); if (!tail) { head = node; } else { tail->right = node; node->left = tail; } tail = node; dfs(node->right); }
private: Node *head = nullptr, *tail = nullptr; };
class Solution { public: Node* treeToDoublyList(Node* root) { if (!root) return nullptr;
Node *head = nullptr, *prev = nullptr; stack<Node*> stk; while (!stk.empty() || root) { while (root) { stk.push(root); root = root->left; } root = stk.top(); stk.pop(); if (!prev) { head = root; } else { prev->right = root; root->left = prev; } prev = root; root = root->right; } head->left = prev; prev->right = head;
return head; } };
|