C# 按顺序打印二叉树

C# 按顺序打印二叉树,c#,algorithm,binary-tree,C#,Algorithm,Binary Tree,我在将排序数组转换为二叉树时遇到了一个问题。我想我已经做到了。现在我只想打印转换后的所有项目,以进行双重检查 我的问题是,我的打印部件没有打印所有项目。“inOrderTraversalHelper”方法中存在错误 class Program { // Given an array where elements are sorted in ascending order, // convert it to a height balanced BST static int

我在将排序数组转换为二叉树时遇到了一个问题。我想我已经做到了。现在我只想打印转换后的所有项目,以进行双重检查

我的问题是,我的打印部件没有打印所有项目。“inOrderTraversalHelper”方法中存在错误

class Program
{
    // Given an array where elements are sorted in ascending order, 
    // convert it to a height balanced BST
    static int[] arr = new int[8] {1,2,3,4,5,6,7,8};
    static TreeNode node { get; set; }
    static void Main(string[] args)
    {
         node = SortedArrayToBST(arr, 0, arr.Length-1);
         inOrderTraversal();
    }

    static void inOrderTraversal()
    {
        inOrderTraversalHelper(node);
    }
    static void inOrderTraversalHelper(TreeNode r)
    {
        if (r != null)
        {    
          **// UPDATED**

            inOrderTraversalHelper(r.leftNode);
             Console.Write("{0}   ", r.data);
            inOrderTraversalHelper(r.rightNode);
        }
    }
    static TreeNode SortedArrayToBST(int[] a,int start,int end)
    {
        if (start > end) return null;
        int mid = (start + end) / 2;
        TreeNode node = new TreeNode(a[mid]);
        node.leftNode= SortedArrayToBST(a, start, mid-1);
        node.rightNode = SortedArrayToBST(a, mid + 1, end);
        return node;
    }
}

public class TreeNode
{
    public int data;
    public TreeNode leftNode;
    public TreeNode rightNode;

    public TreeNode(int data)
    {
        this.data = data;
    }
}

SortedArrayToBST
中,使用索引
mid
,而不是元素
a[mid]
,更改:

TreeNode node = new TreeNode(mid);
致:

在调用
SortedArrayToBST
函数时,需要传递数组大小-1,因为inclusive中的结束条件改变:

node = SortedArrayToBST(arr, 0, arr.Length);
致:


另外,您的
inOrderTraversalHelper
函数实际上不是按顺序排列的,而是按顺序排列的。

这是因为您存储的是索引
mid
的值,而不是
mid
索引处的值:

int mid = (start + end) / 2;
TreeNode node = new TreeNode(mid);
您正在计算mid的值,然后将其作为数据传入。相反,mid应该是所需值的
索引。例如,如果您有一个数据集,其中数据是按顺序排列的,但不是按顺序排列的,那么您将得到更奇怪的结果:

{-1,22,33,44,55,66,77,100}
因此,您的代码可能应该在索引
mid
处查找该值:

var mid = (int)((start + end) / 2.0);
var node = new TreeNode(arr[mid]);

你看到了什么输出?没有这些信息很难说。4,1,0,2,3,6,5,7,8。0是意外的。您知道按顺序遍历函数不是按顺序的,而是按预顺序的,对吗?无论按哪个顺序,元素集都与原始数组不匹配。预订单不应包含“0”。很好!但是,为什么通过浮点计算mid会有不同呢?我更正了它。但你的结果是错误的,相信我。你可以复制粘贴试试。我想在这种情况下不会。根据代码,打印结果将是“1,2,3,4,5,6,7,8”。这是错误的。你可以试试。1-8顺序有什么问题?在BST中,应该对顺序遍历进行排序。
{-1,22,33,44,55,66,77,100}
var mid = (int)((start + end) / 2.0);
var node = new TreeNode(arr[mid]);