좋아,이 함수를 실행할 때마다 이진 트리의 각 수준에서 노드를 참조하는 linkendlist 목록을 가져올 것으로 예상됩니다. 그러나이 함수는 모든 레벨에 대해 빈 linkendlists를 반환합니다. 누군가 왜 저에게 말할 수 있습니까? 나는 자바에서도 해결책을 추가했다.C# list가 변수에 대한 참조를 추가하는 이유는 무엇입니까?
public static void Main()
{
BinaryTree t = new BinaryTree(0);
BinaryTree l1 = new BinaryTree(1);
BinaryTree l2 = new BinaryTree(2);
BinaryTree l3 = new BinaryTree(3);
BinaryTree l4 = new BinaryTree(4);
BinaryTree l5 = new BinaryTree(5);
BinaryTree l6 = new BinaryTree(6);
t.left = l1;
t.right = l4;
l1.left = l2;
l1.right = l3;
l4.left = l5;
l4.right = l6;
List<LinkedList<BinaryTree>> lod = ListOfDepth(t);
// this will print empty list
foreach (var item in lod)
{
foreach (var lst in item)
{
Console.Write(lst.data);
}
Console.WriteLine();
}
}
public class BinaryTree
{
public BinaryTree(int d) { data = d; }
public BinaryTree() { }
public int id;
public int data;
public BinaryTree left = null;
public BinaryTree right = null;
}
public static List<LinkedList<BinaryTree>> ListOfDepth(BinaryTree t)
{
List<LinkedList<BinaryTree>> lst = new List<LinkedList<BinaryTree>>();
// add current level to lst
LinkedList<BinaryTree> curLevel = new LinkedList<BinaryTree>();
curLevel.AddLast(t);
lst.Add(curLevel);
LinkedList<BinaryTree> newLevel = new LinkedList<BinaryTree>();
while (curLevel.Count > 0)
{
BinaryTree curNode = curLevel.First.Value;
curLevel.RemoveFirst();
if (curNode.left != null)
{
newLevel.AddLast(curNode.left);
}
if (curNode.right != null)
{
newLevel.AddLast(curNode.right);
}
if (curLevel.Count == 0)
{
curLevel = newLevel;
if (newLevel.Count > 0)
{
lst.Add(newLevel);
}
newLevel = new LinkedList<BinaryTree>();
}
}
return lst;
}
Java 버전.
ArrayList<LinkedList<BinaryTree>> listofDepth(BinaryTree root) {
ArrayList<LinkedList<BinaryTree>> result = new ArrayList<LinkedList<BinaryTree>>();
LinkedList<BinaryTree> current = new LinkedList<BinaryTree>();
if (root != null) {
current.add(root);
}
while (current.size() > 0) {
result.add(current);
LinkedList<BinaryTree> parents = current;
current = new LinkedList<BinaryTree>();
for (BinaryTree parent : parents) {
if (parent.left != null) {
current.add(parent.left);
}
if (parent.right != null) {
current.add(parent.right);
}
}
}
return result;
}
C#, Java 및 C++은 3 가지 매우 관련이없는 언어입니다. 구문 상 유사점이 있지만 그 차이가 있습니다. 그들과 그들의 도서관을 비교할 수 없으며 비교할 필요도 없습니다. –
@Someprogrammerdude : 제 질문은 C# 참조에 관한 것입니다. C++을 참조하는 태그를 제거했습니다. – Mark
* 여기 curLevel을 lst에 추가하면 curlevel에 변수를 추가하고 참조하는 것이 아닌 것 같습니다. * 그게 무슨 뜻입니까? –