一、题目
翻转一棵二叉树。
示例:
二、思路及代码实现
方法一:递归
借鉴反转链表: https://blog.csdn.net/weixin_45594025/article/details/104907136
运用递归思维,先翻转节点的孩子,最后翻转整棵树。过程如下:
假设根节点的左、右孩子已经成功翻转,可得到:
此时,只需将根节点的左、右孩子互换,即可完成翻转。结果如下:
代码如下:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null || (root.left == null && root.right == null))
return root;
TreeNode node = root;
TreeNode leftChild = invertTree(node.left);;
TreeNode rightChild = invertTree(node.right);;
root.left = rightChild;
root.right = leftChild;
return root;
}
}
方法二:迭代
翻转二叉树就是把二叉树每个节点的左、右孩子互换。可以利用队列进行处理,过程如下:
- 创建一个队列,刚开始先把根节点加入队列;
- 只要队列不空,每次从队列中出队一个节点,互换其左、右孩子,并将该节点不为空的孩子节点入队;
- 最终队列为空时,所有的孩子互换完毕,返回最初的根节点。
代码如下:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return root;
}
LinkedList<TreeNode> list = new LinkedList<>();
list.add(root);
while(!list.isEmpty()){
TreeNode current = list.poll();
TreeNode temp = current.left;
current.left = current.right;
current.right = temp;
if(current.left != null)
list.add(current.left);
if(current.right != null)
list.add(current.right);
}
return root;
}
}