问题: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正在对输出进行遍历,这不是很清楚。
我该如何解决?
答案 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;
}
}
}