二叉树展开为链表。给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1 |
|
将其展开为:
1 |
|
1 |
|
思路一
展开的链表是原树的先序遍历的结果,即当前节点的右结点指向的元素是该结点前序遍历的下一个结点,采用自底向上的方法,从尾结点开始生成,即采用逆序的后根遍历 (right, left, root)
来实现。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
1 |
|
思路二
通过堆栈解决。时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
1 |
|
思路三
因为展开的链表是先序遍历的结果,所以首先找到当前结点的右子树根结点的前一个结点,这样就可以直接将当前结点的右子树作为该结点的右子树,之后再将当前结点点的左子树变为当前结点点的右子树,往后遍历。
1 |
|
时间复杂度 \(O(n)\),空间复杂度 \(O(1)\)。