var invertTree = function(root) {
if(root === null) return null;
var temp = root.left;
root.left = invertTree(root.right);
root.right = invertTree(temp);
return root;
};
var invertTree = function(root) {
if(root === null) return;
// swap left and right child
var temp = root.left;
root.left = root.right;
root.right = temp;
// recurse into children
invertTree(root.left);
invertTree(root.right);
};
这两个程序的递归细节是一样的吗?
第一个函数最后由return语句返回传给函数的节点 root.left = invertTree(root.right); 可以翻成 ==> root.left =root.right; invertTree(root.right);
二者的区别在于交换子树木的节点和赋值的先后关系 (answer from kikong)
第二种看起来清晰一点。细节的话无所谓,结果一样就好了。
@QuoniamYIF @alsotang @jiyinyiyong 这里应该是二叉树的节点交换吧,我想问下这里的递归涉及到尾递归优化么?很明显两种写法还是有差别
@jiyinyiyong ES6 babel转码的时候进行了尾递归优化 @QuoniamYIF 能不能提供下数据结构
@jiyinyiyong 它这里两次递归调用,所以我也不知道怎么尾递归优化。希望知道数据结构,最好搞个特别大的数据模拟下。但是看代码感觉数据结构有点问题,搞不懂
{
left: {
left: {
left: {},
right: {}
},
right: {
left: {},
right: {}
}
},
right: {
left: {
left: {},
right: {}
},
right: {
left: {},
right: {}
}
}
}
根据方法,我感觉数据结构是这样的,不过有啥意义?
@yuyang041060120 原题里有数据结构实现的方式 vert-binary-tree
@yuyang041060120 已经可以尾递归优化了?
@firefox 两次调用,一时我还真不知道怎么优化,在想想想
@jiyinyiyong 两次调用,我没有想到怎么优化,大哥有啥idea没