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