刚好头条笔试的时候问到了,记录一下答案。二叉树的题一般用递归的思想做,递归中注意两点:
1、注意返回的边界条件
2、注意模块化的思想,从局部都一点入手处理,然后对把处理逻辑当做完成的部分来处理,不要越陷越深
回到题目,这道题目的思路是把给定的二叉树按照先序遍历的顺序转换成链表,二叉树的每个节点right指向下一个节点。对某一个节点进行处理,然后递归处理左节点、右节点,之后当做处理完成,即左节点全部变成了转化好的链表,右节点也全部完成转化。把左子树的链表的最后一个节点指向有子树即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public void flatten(TreeNode root) {
if (root == null) {
return;
}
if (root.left != null) {
flatten(root.left);
}
if (root.right != null) {
flatten(root.right);
}
TreeNode temp = root.right;
root.right = root.left; // 右节点赋值为昨节点
root.left = null;
// 走到左边的左后一个节点,然后与右节点相连,注意判断条件是root.right
while (root.right != null) {
root = root.right;
}
root.right = temp;
}
}