难度:【中等】
给定一个二叉树,原地将它展开为一个单链表。
示例:
例如,给定二叉树
1 / \ 2 5 / \ \ 3 4 6
将其展开为:
1 \ 2 \ 3 \ 4 \ 5 \ 6
解题思路:
对于当前节点,如果其左子节点不为空,则在其左子树中找到最右边的节点,作为前驱节点,将当前节点的右子节点赋给前驱节点的右子节点,然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点设为空。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。
代码实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void flatten(TreeNode root) {
TreeNode cur = root;
while(cur!=null){
if(cur.left!=null){
TreeNode rightNode = cur.left;
while(rightNode.right!=null){
rightNode = rightNode.right;//找左子树的最右结点(右子树前驱结点)
}
rightNode.right = cur.right;//将cur右子树链接到前驱节点的右子树
cur.right = cur.left;
cur.left = null;
}
cur = cur.right;
}
}
}
复杂度分析
-
时间复杂度:O(n)。
-
空间复杂度:O(1)。