索引
链接
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/
新得
这个题目注明了,需要原地展开,也就是不使用新得内存空间,使用原来二叉树的节点来展开。展开后的树其实特征很明显
- 每个节点只有右节点有值
- 新展开的树从上到下的节点顺序是先序遍历的顺序
树的题目一开始就往三种遍历(先序、中序、后序)顺序去想大概率会命中,这道题就是使用先序遍历的思路可以解决。
思路
当使用先序遍历的方式遍历每个节点时,将每次访问的节点从树上摘除,然后挂到新树上,再继续访问左子树,右子树,重复同样的操作(递归)即可。
代码
/**
* 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 {
private TreeNode rightLastNode;
/**
* 先序遍历搞定树的展开
*/
public void flatten(TreeNode root) {
if (root == null) {
return;
}
TreeNode left = root.left;
TreeNode right = root.right;
if (rightLastNode != null) {
rightLastNode.right = root;
}
rightLastNode = root;
root.left = null;
root.right = null;
flatten(left);
flatten(right);
}
}
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/2677

微信
支付宝