1、题目描述
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/
2、解法:
/**
* 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) {
if(root==null) return;
flatten(root.left);// //先展开左子树,
flatten(root.right);//,再展开右子树
//记录之前的右子树
TreeNode preRight = root.right;
//展开操作
root.right = root.left;
root.left = null;
//链接操作
TreeNode p = root;
while(p.right!=null){
p = p.right;
}
//现在的右子树的右子树链接之前的右子树展开
p.right = preRight;
}
}
算法思维铭记:
- 递归算法的关键要明确函数的定义,相信这个定义,而不要跳进递归细节。
- 写二叉树的算法题,都是基于递归框架的,我们先要搞清楚 root 节点它自己要做什么,然后根据题目要求选择使用前序,中序,后续的递归框架。
- 二叉树的问题难点在于,如何把题目的要求细化成每个节点需要做的事情
- 递归要解决的问题是什么