l****r 发帖数: 105 | 1 最近没事刷刷leetcode,碰到几个二叉树问题,测试时创建二叉树手写起来太麻烦(C#
),所以想自己搞个工具,作用是根据给定数组创建二叉树。
初步写出来是这样的:
public static TreeNode CreateBinaryTree(int[] values)
{
TreeNode root = new TreeNode(values[0]);
Queue nodeQueue = new Queue();
nodeQueue.Enqueue(root);
TreeNode current = null;
foreach (var value in values.Skip(1))
{
if (current == null || (current.left != null && current.
right != null))
current = nodeQueue.Dequeue();
TreeNode node = new TreeNode(value);
if (current.left == null)
{
current.left = node;
nodeQueue.Enqueue(current.left);
}
else if (current.right == null)
{
current.right = node;
nodeQueue.Enqueue(current.right);
}
}
return root;
}
这个方法的问题在于没有处理空节点的情况,
现在只能是在给定数组时把空节点置为-1,然后在返回前遍历数组将值为-1的节点置空。
请问有没有办法改进一下,谢谢。 | l******s 发帖数: 3045 | 2 这要看你怎么定义你的数组了,leetcode上的test case不用考虑每一层的2^n个可能性
节点,而只列出定义上一层可能的子节点就行了。 | l****r 发帖数: 105 | 3 谢谢回复,不过我完全没看懂后半句
我的数组定义方式是
new int[] { 5, 4, 8, 11, -1, 13, 4, 7, 2, -1, -1, -1, -1, 5, 1 }
生成下面的二叉树
5
/
4 8
/ /
11 13 4
/ /
7 2 5 1
【在 l******s 的大作中提到】 : 这要看你怎么定义你的数组了,leetcode上的test case不用考虑每一层的2^n个可能性 : 节点,而只列出定义上一层可能的子节点就行了。
| l******s 发帖数: 3045 | 4 我的意思跟你的方法一样。
不过你的数组似乎应该生成下面的树才对
| 5
| / \
| 4 8
| / / \
| 11 13 4
| / \
| 7 2
| / \
|5 1
那么碰到-1就不赋那个相应的指针的值就好了。 | j**********3 发帖数: 3211 | |
|