递归
自顶向下
//先替换顶层节点,再替换底层节点var invertTree = function(root) { if(root === null) return null; //替换左右结点 var tmp = root.left; root.left = root.right; root.right = tmp; if(root.left){ invertTree(root.left); } if(root.right){ invertTree(root.right); } return root;};
自底向上
//先替换底层节点,再替换顶层节点var invertTree = function(root) { //定义递归返回的条件 if(!root) return null; //先应用递归找到最底层的左右子树 let left = invertTree(root.left); let right = invertTree(root.right); //别离替换左右子树 root.right = left; root.left = right; return root;}
迭代
思路:保护一个数组,这个数组外面寄存的是没有替换过左右子树的节点
//思路:保护一个数组,这个数组外面寄存的是没有替换过左右子树的节点//自顶向下var invertTree = function(root) { if(!root) return null; //这个数组一开始寄存的只有根结点 var arr = [root]; while(arr.length) { let current = arr.pop(); //别离替换current节点的左右子树 let temp = current.left; current.left = current.right; current.right = temp; //再判断current节点的左右子树是否存在,如果存在则放进数组 if(current.left) arr.push(current.left); if(current.right) arr.push(current.right); } return root;}