题目

类型:Stack

难度:中等

二叉树展开为链表 - 图1

解题思路

对于当前节点,如果其左子节点不为空,则在其左子树中找到最右边的节点,作为前驱节点,将当前节点的右子节点赋给前驱节点的右子节点,然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点设为空。对当前节点处理结束后,继续处理链表中的下一个节点,直到所有节点都处理结束。

代码

  1. class Solution {
  2. public void flatten(TreeNode root) {
  3. TreeNode curr = root;
  4. while (curr != null) {
  5. if (curr.left != null) {
  6. TreeNode next = curr.left;
  7. TreeNode predecessor = next;
  8. while (predecessor.right != null) {
  9. predecessor = predecessor.right;
  10. }
  11. predecessor.right = curr.right;
  12. curr.left = null;
  13. curr.right = next;
  14. }
  15. curr = curr.right;
  16. }
  17. }
  18. }