【问题标题】:How do I invert a binary search tree?如何反转二叉搜索树?
【发布时间】:2019-02-20 16:33:47
【问题描述】:

问题: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是在对输出做一个前序遍历,不是很清楚。

我该如何解决这个问题?

【问题讨论】:

  • 为什么要搞砸树呢?为什么不只是有一个单独的 proc,getInorderR,它以 right-mid-left 而不是传统的 left-mid-right 遍历树?
  • 我不太明白你在说什么。是否应该用reverse-inorder反转顺序?
  • 有一个更简单的解决方案,它不会触及这些值。遍历树,交换每个节点的左右指针。
  • 哦,是的。我现在正在尝试使用队列迭代地执行此操作。 Leetcode 的输出有点太神秘了。对于 [1,2] 作为输入,他们期望 [1, null, 2] 作为输出。我现在有点迷路了。
  • 您的打印代码中似乎有一个错误,因为当前代码似乎是正确的(假设输入确实是一个搜索树,问题没有说明)。你能显示打印最终结果的代码吗?

标签: c++ binary-search-tree


【解决方案1】:

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

  1
 / \
2   5
   / \
  3   4

只能更改值,以便按顺序遍历会生成一个反向列表:

  5
 / \
4   3
   / \
  1   2

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

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

    1
   / \
  5   2
 / \
4   3

要做到这一点,您需要停止使用向量并停止收集值。该算法成为一个平凡的单函数递归算法。可以用一个有 6 行正文的函数来完成。

但是,如果您想创建一个反向副本,而不是改变原始树,那么它会变成一个 7 行正文。

【讨论】:

  • 非常感谢。我的方法是错误的。我已经使用一个队列切换到迭代解决方案,其中左开关和八个指针。这已经解决了这个问题。
【解决方案2】:
Recursive Approach:

    public TreeNode invertTree(TreeNode root) {
        return invert(root);
    }

    public TreeNode invert(TreeNode root) {
        //base case 1
        if (root == null)
            return null;
        //base case 2
        if ((root.left == null) && (root.right == null)) {
            return root;
        } else {

            TreeNode leftt = invert(root.left);
            TreeNode rightt = invert(root.right);
            //swap nodes
            root.right = leftt;
            root.left = rightt;
            return root;
        }
    }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多