尽管写LeetCode解答主要是为了自己整理思路,但是如果对您也正好有帮助,请点个赞给菜鸟一点鼓励吧 :-)
原题
解法分析
解法1使用了递归;
解法2使用了迭代法,为广度优先的层级遍历。
解法1
解法分析
递归。反转左子树与右子树,最后交换根节点的左子树与右子树。
代码
public class Solution226_recursive {
public TreeNode invertTree(TreeNode root) {
if (root == null || (root.left == null && root.right == null))
return root;
TreeNode invertedLeft = invertTree(root.left);
TreeNode invertedRight = invertTree(root.right);
root.left = invertedRight;
root.right = invertedLeft;
return root;
}
}
解法2
解法分析
迭代,广度优先搜索。栈中每次存放的是同一层的节点,将这些节点依次取出,交换左右子树,则该层的节点全部已被反转;执行N次,整个树被反转。
图解
看不清图的话可以在浏览器 页面中单独打开。
代码
public class Solution226_iterator {
public TreeNode invertTree(TreeNode root) {
if (root == null)
return root;
Deque<TreeNode> treeNodeDeque = new LinkedList<TreeNode>();
treeNodeDeque.push(root);
while (!treeNodeDeque.isEmpty()){
int dequeSize = treeNodeDeque.size();
while (dequeSize-- > 0){
TreeNode currentNode = treeNodeDeque.pop();
TreeNode tempNode = currentNode.left;
currentNode.left = currentNode.right;
currentNode.right = tempNode;
if(currentNode.left != null)
treeNodeDeque.addLast(currentNode.left);
if (currentNode.right != null)
treeNodeDeque.addLast(currentNode.right);
}
}
return root;
}
}