改变二叉树的根节点
难度:
标签:
题目描述
代码结果
运行时间: 31 ms, 内存: 16.4 MB
/*
* 题目思路:
* 1. 虽然Java Stream不适合直接处理树结构,但我们可以借鉴其思想,
* 使用递归来遍历和调整树的结构。
* 2. 从当前的根节点向下遍历到指定的新根节点。
* 3. 沿途将每个节点的父指针断开,并指向其父节点。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public TreeNode flipBinaryTree(TreeNode root, TreeNode leaf) {
return flip(root, null, leaf);
}
private TreeNode flip(TreeNode root, TreeNode parent, TreeNode leaf) {
if (root == null) return null;
if (root == leaf) {
root.left = parent;
return root;
}
TreeNode newRoot = flip(root.left, root, leaf);
root.left = parent;
return newRoot;
}
}
解释
方法:
此题解的主要思路在于将二叉树中从给定的叶节点开始到根节点的路径上的所有节点进行翻转。具体步骤如下:首先遍历从叶节点到根节点的路径,将这些节点存储在数组中。然后从叶节点开始,逐个将每个节点的父节点变为它的子节点,同时清除原有的父子关系,并调整兄弟节点的关系。这样,最初的叶节点变成了新的根节点,原来的根节点变成了新根的一个子节点,整个树的结构被反转了。
时间复杂度:
O(h)
空间复杂度:
O(h)
代码细节讲解
🦆
如何确保给定的叶节点`leaf`确实是一个叶节点,而不是树中的其他节点?
▷🦆
在将原父节点变为当前节点的子节点时,如果当前节点已有左子节点,为什么选择将原父节点放在左边而把原左子节点移至右侧?
▷🦆
在修改节点的父子关系后,如何处理可能因此操作造成的树的不平衡问题?
▷🦆
请问在代码中如何处理根节点自身没有父节点的情况,即如何判断并结束整个反转操作的循环?
▷