如何反转二叉搜索树?

时间:2019-02-20 16:33:47

标签: 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正在对输出进行遍历,这不是很清楚。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

该代码仅更改val字段,而不更改原始拓扑。这样一棵树看起来像:

  1
 / \
2   5
   / \
  3   4

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

  5
 / \
4   3
   / \
  1   2

对于二进制搜索树,这看起来要好得多,但这不是最初的问题描述。使用BST,这种反转会产生带有反向比较运算符的BST。

幸运的是,通常树反转表示对树的完整反转,包括其拓扑结构。幸运的是,因为获得完整的逆转比仅值逆转更容易编写代码。在上面的示例中,原始文件的完全反转产生了

    1
   / \
  5   2
 / \
4   3

要知道,您需要停止使用向量并停止收集值。该算法成为一种简单的单功能递归算法。可以使用具有6条线的主体的函数来完成。

但是,如果您要创建反向副本,而不是对原始树进行变异,那么它将变为7行主体。

答案 1 :(得分:0)

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;
        }
    }
    }