题解 | #牛群的树形结构展开II#

牛群的树形结构展开II

https://www.nowcoder.com/practice/3e89ca58f76d4e6aa44cf29569017410

考察的知识点:二叉树的中序遍历;

解答方法分析:

  1. 创建一个虚拟节点dummy,用来保存展开后链表的头节点。
  2. 创建一个指针curr,用来指向当前链表的末尾。
  3. 创建一个栈stk,用来模拟递归的过程。
  4. 初始化一个指针node,指向根节点root。
  5. 进入循环,当node不为空或者栈不为空时:先遍历左子树,将所有子节点依次压入栈中,直到叶子节点为止。弹出栈顶的节点,表示该节点的左子树已经处理完毕。将该节点链接到curr的右侧,同时将节点的左子节点置为空。更新curr为当前节点。继续处理右子树,令node指向当前节点的右子节点。
  6. 返回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;
    }
};

全部评论

相关推荐

快点约我面试吧
投递百度等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务