Leetcode - 156. 上下翻转二叉树
解题思路参考代码中的注释(代码未经过测试,因此可能会有错误,但思路是正确的):
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
/**
* 已知条件:有一棵二叉树,该树上的任何一个节点的右子节点要么为空,要么是叶子节点且有兄弟节点
* 题目要求:将这棵树进行上下翻转,返回新树的根
* 1 4
* / \ / \
* 2 3 => 5 2
* / \ / \
* 4 5 3 1
* 解题思路:可以使用递归的方法
* - 先看节点2,反转后它的左子节点4变成了它的父节点,它的右子节点5变成了它的左兄弟节点
* - 再看节点1,反转后它的左子节点2变成了它的父节点,它的右子节点3变成了它的左兄弟节点
*/
// 1. 将节点1传入该方法
// 3. 将节点2传入该方法
// 5. 将节点4传入该方法
public TreeNode upsideDownBinaryTree(TreeNode root) {
// 6. 直接返回节点4
if (root == null || root.left == null) {
return root;
}
// 2. 对节点1的左子节点进行翻转
// 4. 对节点2的左子节点进行翻转
// 7. ret代表节点4,而此时的root为节点2
// a. ret代表节点4,而此时的root为节点1
TreeNode ret = upsideDownBinaryTree(root.left);
// 8. 修改节点2、节点4、节点5之间的关系
// b. 修改节点1、节点2、节点3之间的关系
root.left.left = root.right;
root.left.right = root;
root.left = null;
root.right = null;
// 9. 返回节点4
// c. 返回节点4
return ret;
}
}

