Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何反转二叉搜索树?_C++_Binary Search Tree - Fatal编程技术网

C++ 如何反转二叉搜索树?

C++ 如何反转二叉搜索树?,c++,binary-search-tree,C++,Binary Search 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

问题:

我的做法:

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;
    }
void getInorder(std::vector&vec,TreeNode*root){
如果(根){
getInorder(向量,根->左);
向量推回(根->值);
getInorder(向量,根->右);
}
}
void setValues(TreeNode*root,std::vector&vec,int&i){
如果(根){
设置值(根->左,向量,i);
root->val=vec[i];
我--;
设置值(根->右,向量,i);
}
}
TreeNode*反向树(TreeNode*根){
std::矢量索引列表,sol;
getInorder(inorderList,root);
int i=inordList.size()-1;
设置值(根,索引列表,i);
getInorder(sol,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
要得到它,您需要停止使用向量并停止收集值。该算法成为一个简单的单函数递归算法。它可以通过一个包含6行的函数来完成


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

为什么要修改树?。为什么不使用一个单独的proc,
getInorderR
,它以右中左而不是传统的左中右的方式遍历树?我不太明白你的意思。是否应使用反向顺序反转顺序?有一种更简单的解决方案,它不涉及值。遍历树并交换每个节点中的左右指针。哦,是的。我现在正尝试使用队列迭代地执行此操作。Leetcode的输出有点太神秘了。对于[1,2]作为输入,他们期望[1,null,2]作为输出。我现在有点迷路了。似乎你的打印代码中有一个bug,因为当前的代码似乎是正确的(假设输入是一个真正的搜索树,问题并没有说明)。你能展示打印最终结果的代码吗?非常感谢。我的方法是错误的。我已经切换到一个迭代解决方案,使用一个队列,在这个队列中,开关向左,八个指针左右。这解决了这个问题。
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;
        }
    }
    }