NO.114 二叉树展开为链表 中等
思路一:前序遍历 观察示例,发现展开后的链表是二叉树的前序遍历序列。
可以先前序遍历获得遍历序列,然后将序列依次连接到根的右节点上。
1 | public void flatten(TreeNode root) { |
时间复杂度:O(n) 空间复杂度:O(n)不符合要求
思路二:原地修改指向 依然是观察示例,得到一个大概的思路把靠右的元素先连接到左子树的最右节点上,然后把整个左子树覆盖到之前靠右的元素位置。这样多次进行,从而把一个二叉树”捋顺”,即所有的节点都移到最右边。看下面例子,结合代码很好理解。
如果curr的左子树不为空,找到左子树的最右节点p,将p的右指针指向curr的左子树,如下图:
(这是是个示意图,实际结构中curr右指针依然指向3节点),然后将curr的右指针指向curr的左子树,并将curr的左指针置空。
移动curr指针,然后像之前一样curr的左子树不为空,curr左子树的最右节点为p,p的右指针指向curr的右子树。
重复第二步,curr的右指针指向curr的左子树,curr的左指针置空。
继续向右深搜移动curr,找到下一个左指针不为空的节点。
curr的左子树的最右节点为p,p的右指针指向curr的右子树。
curr的右指针指向curr的左子树,curr的左指针置空。
继续向右深搜移动curr寻找左指针不为空的节点,curr为空,展开完成。
1 | public void flatten(TreeNode root) { |
时间复杂度:O(n) 最坏情况二叉树初始就是链表形式,但是全部都是靠左,curr需要遍历每个节点。
空间复杂度:O(1)
本人菜鸟,有错误请告知,感激不尽!
更多题解和源码:github