Создайте копию бинарного дерева поиска и отобразите его в TreeView
Необходимо создать двоичное дерево поиска, а затем скопировать дерево и отобразить в TreeView. метод создания дерева
public DTreeNode Created(DTreeNode root,char temp, int nums) //temp - information field.nums - key
{
if (root == null)
{
root = new DTreeNode(temp, nums);
root.Left = null;
root.Right = null;
}
else
{
if (nums < root.Key)
{
root.Left = Created(root.Left, temp, nums);
}
else
{
root.Right = Created(root.Right, temp, nums);
}
}
return root;
}
Методы вывода дерева в TreeView
public void Show(TreeView tree, DTreeNode root)
{
tree.Nodes.Clear();
if (root != null)
{
tree.Nodes.Add(root.Info + " (" + root.Key + ")");
KLP(tree.Nodes[0], root.Left);
KLP(tree.Nodes[0], root.Right);
}
}
public void KLP(TreeNode node, DTreeNode place)
{
if (place != null)
{
TreeNode branch = node.Nodes.Add(place.Info + " (" + place.Key + ")");
KLP(branch, place.Left);
KLP(branch, place.Right);
}
}
Но как скопировать двоичное дерево поиска и отобразить его в TreeView, я не знаю. Пожалуйста, помогите. Я не могу сделать это уже 5 дней. Вся работа выполняется в Windows Forms.
Ответы (1 шт):
Автор решения: return
→ Ссылка
У вас не BST, а просто Tree, т. к. BST – это значение + left node + right node. Вашу модель я буду реализовывать через интерфейс узлов:
public interface IBinaryTreeNode<T> : ICollection<T>
{
IBinaryTreeNode<T> Root { get; }
IBinaryTreeNode<T>? Parent { get; }
[MaybeNull, AllowNull] // может возвращать/получать null на входе/выходе
T Value { get; set; }
IBinaryTreeNode<T>? Left { get; }
IBinaryTreeNode<T>? Right { get; }
void Remove(); // удаляет этот узел из дерева
int ComputeTotalCount(); // вычисляет кол-во *всех* дочерних узлов данного узла
// ... // прочие методы (не играют важной роли)
}
Такая модель – это модель BST. Если вы не подразумевали подобный этому BST, то смысл не меняется:
Рекурсивный метод
// для BST
public void InitTreeView(TreeNode tree, IBinaryTreeNode<T> node)
{
// checks
tree.Text = node.Value.ToString(); // инициализируем значение данного узла
tree.Nodes.Clear(); // очищаем чтобы инициализация не "стакалась"
// левый узел
var left = new TreeNode();
InitTreeView(left, node.Left);
tree.Nodes.Add(left);
// правый узел
var right = new TreeNode();
InitTreeView(right, node.Right);
tree.Nodes.Add(right);
}
// для Tree
public void InitTreeView(TreeNode tree, ITreeNode<T> node) // `ITreeNode<T>` - интерфейс вашего типа узлов
{
// checks
tree.Text = node.Value.ToString();
tree.Nodes.Clear();
foreach (var child in node.Children)
{
var _child = new TreeNode();
InitTreeView(_child, child);
tree.Nodes.Add(_child);
}
}