【LeetCode(Java) - 156】上下翻转二叉树
【LeetCode(Java) - 156】上下翻转二叉树
文章目录
1、题目描述
2、解题思路
3、解题代码
1、题目描述
2、解题思路
??光看题目还是懵懵懂懂,不如我把一个二叉树倒着过来看:
??我们可以看出一个规律:对于任意一个节点,它的右结点变为左子节点的左子节点,它自己变为它左子节点的右子结点。
??我们知道,对于一个节点来说,关心的是它的左右子结点,至于它的父节点是谁可以递归求解。
??因此,我们需要对每一个节点的左子节点进行重新设置左右节点。
??定义一个 head 作为新的头结点。
??定义 DFS 函数,功能如下:
??1、node 为叶子节点且 head 为空,则 node 的左子节点成为新的头结点,head = node.left;
??2、node 为 null,return;
??3、node 不是叶子节点也不为 null,则把 node 的右子节点作为 node 的左子节点的左子节点,node 自己作为它左子节点的右子节点,最后 node 的左右子结点置空,即不再是原来左右子结点的父节点了。
3、解题代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 处理之后的根节点
TreeNode head;
public TreeNode upsideDownBinaryTree(TreeNode root) {
if (root == null) {
return null;
}
dfs(root); // 对 root 进行上下翻转
return head;
}
public TreeNode dfs(TreeNode node) {
if (node == null) {
return null;
}
if (node.left == null && node.right == null) {
if (head == null) {
// 最左边的节点即为实际的根节点
head = node;
}
return node;
}
TreeNode left = dfs(node.left);
TreeNode right = dfs(node.right);
if (left != null) {
// 左孩子的左子树为当前的右节点
left.left = right;
// 左孩子的右子树为当前父节点
left.right = node;
}
// 清空的当前父节点的左右子树
node.right = null;
node.left = null;
return node;
}
}
【LeetCode(Java) - 156】上下翻转二叉树相关教程