【问题标题】:Reassigning a global variable in a recursive call在递归调用中重新分配全局变量
【发布时间】:2021-07-12 03:07:27
【问题描述】:

我正在尝试problem,这是我的代码。

class Program
    {
        static void Main(string[] args)
        {
            Solution s = new Solution();
            s.CreateTree();
        }
    }

    

 public class TreeNode {
     public int val;
     public TreeNode left;
     public TreeNode right;
     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
         this.val = val;
         this.left = left;
         this.right = right;
     }
 }
 
 public class Solution
    {
        static TreeNode n1;
        //static or instance , didn't make any difference
        Queue<TreeNode> q = new Queue<TreeNode>();
        public TreeNode IncreasingBST(TreeNode root)
        {
            TraverseAndCreateTree(root);
            var rootNodeOfResultantTree = q.Dequeue();
            return rootNodeOfResultantTree;
        }

        public void CreateTree()
        {            
            TreeNode t = new TreeNode(5);
            t.left = new TreeNode(3);
            t.right = new TreeNode(6);
            t.left.left = new TreeNode(2);
            t.left.right = new TreeNode(4);
            t.left.left.left = new TreeNode(1);
            t.right.right = new TreeNode(8);
            t.right.right.left = new TreeNode(7);
            t.right.right.right = new TreeNode(9);
            IncreasingBST(t);
        }

        public void TraverseAndCreateTree(TreeNode root)
        {
            if (root == null)
            {
                return;
            }
            TraverseAndCreateTree(root.left);
            n1 = new TreeNode(root.val);
            q.Enqueue(n1);
            n1 = n1.right;   
            //reassigned the global variable
            TraverseAndCreateTree(root.right);
              

        }
    }

我知道代码对问题不正确,但我无法理解为什么全局变量重新分配不起作用。我期待我的全局变量 n1 被重新分配为其右子节点并获得它的值。但这不会发生。检查q中的第一个值时,它的左右孩子都是null。

这可能是什么原因?全局变量是否不会在所有调用堆栈条目之间共享,并且如果在其中一个条目中发生更改,是否应该在所有条目中反映出来?

【问题讨论】:

  • 我不明白你为什么会这么想。在您的代码中,您从未设置任何节点的右子节点。你从来没有写过像node.right = ...; 这样的东西。
  • @Sweeper :- 很好。我现在才意识到

标签: c# recursion tree global-variables


【解决方案1】:

我分配的代码有误

n1 = new TreeNode(root.val);
q.Enqueue(n1);
n1 = n1.right;

此时 n1.right 为空,因此 n1 变为空,队列中的两个条目之间没有建立任何关系。

我在分配后更正了

n1.right = new TreeNode(root.val);
q.Enqueue(n1);
n1 = n1.right;

【讨论】:

  • 我认为您不需要在这里排队,因为您只需出队一次。您只需要跟踪根是什么。
  • @Sweeper,是的,我现在使用全局变量来跟踪它。谢谢
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 2018-10-31
  • 2014-12-25
  • 2019-03-31
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 2020-10-02
相关资源
最近更新 更多