只向树的右侧添加元素

Only adding elements to the right side of the tree

在 Leetcode 上,我应该“压平”一棵树,使其成为“链表”。

/**
 * 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 {
    TreeNode result =  new TreeNode(-1);;
    
    public void flatten(TreeNode root) {
        if (root == null) return; 
        solution1(root);
        root = result.right; 
    }
    
    public void solution1(TreeNode root) {
        if (root != null) {
            
            result.right = new TreeNode(root.val);
            result = result.right;
            

            if (root.left != null) solution1(root.left);
            if (root.right != null) solution1(root.right);
        }
    }
}

有问题的代码行在这里:

result.right = new TreeNode(root.val);
result = result.right;

我试图只在树的右侧添加元素(所以它看起来像一个链表)但是每次我 运行 我的代码时,我的“链表”看起来像一个输入树的精确副本。

如果有人能指出正确的方向,我将不胜感激!

https://leetcode.com/problems/flatten-binary-tree-to-linked-list/ ^ 这就是问题所在。我发布的代码是我认为天真的解决方案的第一个“运行down”。

因为 result = result.right; 你的 result 指向你添加的最后一个节点。 所以没有指向你的新根的指针。 root = result.right; 实际上什么都不做,因为你 re-assign 参数并且从不使用它(顺便说一句:你应该避免 re-assigning 参数,创建局部变量)。 您可以修改您的 solution1(在第一个 if 之后)和 root 指向您的 LinkedList:

if (this.result == null) {
    this.result = new TreeNode(root.val);
    this.pointer = this.result;
} else {
    this.pointer.right = new TreeNode(root.val);
    this.pointer = this.pointer.right;
}

TreeNode pointer; 是新 class 成员。 result 未初始化,因此在第一次迭代时为 null