Еще одно полезное использование для Dispatcher.Invoke
- это немедленное обновление пользовательского интерфейса в функции, выполняющей другие задачи:
// Force WPF to render UI changes immediately with this magic line of code...
Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
Я использую это, чтобы обновить текст кнопки до « Обработка ... "и отключить его при выполнении запросов WebClient
.
Как первая передача, Вы могли просто создать структура (давайте назовем ее TreeNode), который содержит задача , а также ряд указателей на TreeNode с. Этот набор мог или быть массивом (если N фиксируется) или связанный список (если , N является переменным). Связанный список потребовал бы, чтобы Вы объявили [еще 115] структура (позвольте нам, назвал его ListNode) с указатель TreeNode на фактического ребенка (часть дерева) и указатель на следующее ListNode в списке ( пустой указатель , если в конце списка).
Это могло бы выглядеть примерно так:
struct task {
char command[MAX_LENGTH];
int required_time;
};
struct TreeNode;
struct ListNode {
struct TreeNode * child;
struct ListNode * next;
};
struct TreeNode {
struct task myTask;
struct ListNode myChildList;
};
Любое дерево не может быть представлено как двоичное дерево, где в каждом узле левый указатель указывает первому ребенку, и правильный указатель указывает следующему брату.
R R / | \ | B C D B -- C -- D / \ | | | E F G E -- F G
Так, Ваш случай был бы:
struct task {
char command[MAX_LENGTH];
int required_time;
};
struct node {
struct task taskinfo;
struct node *firstchild;
struct node *nextsibling;
};
Эта техника имеет преимущество, которое много алгоритмов более просты записать, поскольку они могут быть выражены на двоичном дереве, а не на более сложной структуре данных.