c++ - 如何反转二叉搜索树?

标签 c++ binary-search-tree

问题:https://leetcode.com/problems/invert-binary-tree/

我的方法:

void getInorder(std::vector<int> & vec, TreeNode* root){
        if(root){
            getInorder(vec, root->left);
            vec.push_back(root->val);
            getInorder(vec, root->right);
        }
    }

    void setValues(TreeNode*  root, std::vector<int> &vec, int &i ){
        if(root){
            setValues(root->left, vec, i);
            root->val = vec[i];
            i--;
            setValues(root->right, vec, i);
        }
    }

    TreeNode* invertTree(TreeNode* root) {
        std::vector<int> inorderList, sol;
        getInorder(inorderList, root);
        int  i = inorderList.size() - 1;
        setValues(root, inorderList, i);
        getInorder(sol, root);
        return root;
    }

我按顺序遍历树,并记下列表中的值。我再次按顺序遍历树,但这次我开始从列表末尾开始将值分配给节点。这应该交换左右子值,从而在您再次执行排序时提供递减序列。

测试用例 [1,2] 失败。根据它输出 [2,1] 的逻辑,这对我来说似乎是正确的,但实际输出是 [1, null, 2]。我猜leetcode是对输出做前序遍历,不是很清楚。

我该如何解决这个问题?

最佳答案

代码只改变了val字段,没有改变原来的拓扑结构。所以一棵树看起来像:

  1
 / \
2   5
   / \
  3   4

可以只改变值,这样中序遍历会产生一个反转的列表:

  5
 / \
4   3
   / \
  1   2

这看起来用二叉搜索树好多了,但这不是最初的问题描述。对于 BST,这种反转会产生具有反转比较运算符的 BST。

幸运的是,通常树反转意味着树的完全反转,包括它的拓扑结构。幸运的是,因为获得完全反转比仅仅值反转更容易编码。在上面的示例中,原始结果的完全反转:

    1
   / \
  5   2
 / \
4   3

要做到这一点,您需要停止使用 vector 并停止收集值。该算法成为一个简单的单函数递归算法。它可以用一个主体为 6 行的函数来完成。

但是如果你想创建一个反向拷贝,而不改变原始树,那么它就变成了一个 7 行主体。

关于c++ - 如何反转二叉搜索树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54791191/

相关文章:

c++ - C++ 和 C 中指针和数组的区别

c++ - Visual C++ 中的位域问题

c++ - CRC4 INTERLAKEN和ITU查找表生成

c++ - 输出是正确的,但每次打印输出后程序崩溃

python - 二叉搜索树中的值求和错误

c++ - MFC对话框列表控件的工具提示

c++ - 使用 ASSIMP 和 GLSL 的骨骼动画 : bone uniform array size

java - 二叉树的java实现

c++ - 如何为用 vector 构建的二叉搜索树创建插入函数?

具有 1 个参数的 C++ 默认模板化构造函数