ZBLOG

请尽可能列举更多的方案

当然可以!中序遍历二叉树的方法有多种,可以采用不同的方式实现,包括递归、迭代(使用栈)和 Morris 遍历等。以下是几种常见的中序遍历方案:

1. 递归法

这是最直观的方法,通过递归来实现中序遍历。

void inorderTraversal(TreeNode* root, vector<int>& result) {
    if (root == nullptr) return;
    
    inorderTraversal(root->left, result);
    result.push_back(root->val);
    inorderTraversal(root->right, result);
}

2. 迭代法(使用栈)

使用显式栈来模拟递归的过程,适合那些不想使用递归的人。

#include <stack>

vector<int> inorderTraversalIterative(TreeNode* root) {
    vector<int> result;
    stack<TreeNode*> stack;

    TreeNode* current = root;
    
    while (current != nullptr || !stack.empty()) {
        while (current != nullptr) {
            stack.push(current);
            current = current->left;
        }
        
        current = stack.top();
        stack.pop();
        
        result.push_back(current->val);
        
        current = current->right;
    }
    
    return result;
}

3. Morris 中序遍历

这种方法在遍历时不需要额外的空间,但会修改树结构,最终需要恢复原来的结构。

vector<int> morrisInorderTraversal(TreeNode* root) {
    vector<int> result;
    TreeNode *current = root, *pre;

    while (current != nullptr) {
        if (current->left == nullptr) {
            result.push_back(current->val);
            current = current->right;
        } else {
            // 找到当前节点左子树的最右节点
            pre = current->left;
            while (pre->right != nullptr && pre->right != current) {
                pre = pre->right;
            }

            // Establish thread
            if (pre->right == nullptr) {
                pre->right = current; // 创建线程
                current = current->left;
            } else { 
                pre->right = nullptr; // 恢复原形态
                result.push_back(current->val);
                current = current->right;
            }
        }
    }

    return result;
}

4. 分层遍历(适用于特定需求)

虽然不是标准中序遍历,但可以根据需求对结果进行调整,例如返回每一层节点的中序值。

vector<vector<int>> levelOrderInorder(TreeNode* root) {
   vector<vector<int>> levels;

   function<void(TreeNode*, int)> dfs =
       [&](TreeNode* node, int level){
           if (!node) return;

           if(levels.size() <= level)
               levels.emplace_back();

           levels[level].push_back(node -> val);

           dfs(node -> left, level + 1);
           dfs(node -> right, level + 1);
       };

   dfs(root, 0);

   for(auto &level : levels)
       sort(level.begin(), level.end()); // 对每层结果进行排序,以符合某些特定要求

   return levels; 
}

总结

以上列举了四种常用的中序遍历二叉树的方法,每种方法都有其优缺点。在实际应用时,选择哪一种方法取决于具体场景,如空间复杂度、时间复杂度和是否允许修改树结构等因素。希望这些方案能对你有所帮助!如果你还有其他问题,请随时问我。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21836

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?