按顺序打印二叉树

时间:2014-03-17 23:57:04

标签: 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[] 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;
    }
}

2 个答案:

答案 0 :(得分:1)

这是因为您在[{1}}的索引中存储了索引mid的值而不是值

mid

您正在计算mid的值,然后将其作为数据传递。而mid应该是您想要的值的int mid = (start + end) / 2; TreeNode node = new TreeNode(mid); 。例如,如果您有一个数据集,其中数据是按顺序排序的,但是非顺序数据,则会得到更奇怪的结果:

index

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

mid

答案 1 :(得分:0)

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

TreeNode node = new TreeNode(mid);

为:

TreeNode node = new TreeNode(a[mid]);

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

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

为:

node = SortedArrayToBST(arr, 0, arr.Length-1);

此外,您的inOrderTraversalHelper功能实际上并非按顺序排列,而是在订购后。