题解 | #牛群的树形结构展开II#
牛群的树形结构展开II
https://www.nowcoder.com/practice/3e89ca58f76d4e6aa44cf29569017410
考察的知识点:二叉树的中序遍历;
解答方法分析:
- 创建一个虚拟节点dummy,用来保存展开后链表的头节点。
- 创建一个指针curr,用来指向当前链表的末尾。
- 创建一个栈stk,用来模拟递归的过程。
- 初始化一个指针node,指向根节点root。
- 进入循环,当node不为空或者栈不为空时:先遍历左子树,将所有子节点依次压入栈中,直到叶子节点为止。弹出栈顶的节点,表示该节点的左子树已经处理完毕。将该节点链接到curr的右侧,同时将节点的左子节点置为空。更新curr为当前节点。继续处理右子树,令node指向当前节点的右子节点。
- 返回dummy节点的右子节点,即为展开后的链表。
所用编程语言:C++;
完整编程代码:↓
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return TreeNode类 */ TreeNode* flattenII(TreeNode* root) { if (root == nullptr) { return nullptr; } TreeNode* dummy = new TreeNode(0); TreeNode* curr = dummy; stack<TreeNode*> stk; TreeNode* node = root; while (node != nullptr || !stk.empty()) { while (node != nullptr) { stk.push(node); node = node->left; } node = stk.top(); stk.pop(); curr->right = node; node->left = nullptr; curr = curr->right; node = node->right; } return dummy->right; } };