private void Dfs(char[][] board, BoardTrieNode parent, int row, int col, List <string> result)
        {
            if (board == null || board.Length == 0 || board[0].Length == 0 || parent == null || result == null)
            {
                return;
            }
            if (parent.Children.ContainsKey(BoardTrieNode.LeafChar) && !string.IsNullOrEmpty(parent.Children[BoardTrieNode.LeafChar].Word))
            {
                result.Add(parent.Children[BoardTrieNode.LeafChar].Word);
                parent.Children[BoardTrieNode.LeafChar].Word = string.Empty;
            }
            if (row < 0 || row >= board.Length || col < 0 || col >= board[0].Length)
            {
                return;
            }
            char ch = board[row][col];

            if (!parent.Children.ContainsKey(ch))
            {
                return;
            }

            if (ch == VisitingChar)
            {
                return;
            }

            board[row][col] = VisitingChar;

            if (!parent.Children.ContainsKey(ch))
            {
                return;
            }
            Dfs(board, parent.Children[ch], row - 1, col, result);
            Dfs(board, parent.Children[ch], row + 1, col, result);
            Dfs(board, parent.Children[ch], row, col - 1, result);
            Dfs(board, parent.Children[ch], row, col + 1, result);

            board[row][col] = ch;
        }
            private void Insert(BoardTrieNode node, char[] charArray, int startIndex)
            {
                if (node == null || charArray == null || charArray.Length == 0 || startIndex < 0 || startIndex > charArray.Length)
                {
                    return;
                }

                if (startIndex == charArray.Length)
                {
                    node.Children[BoardTrieNode.LeafChar]      = new BoardTrieNode(BoardTrieNode.LeafChar);
                    node.Children[BoardTrieNode.LeafChar].Word = new string(charArray);
                }
                else
                {
                    char ch = charArray[startIndex];
                    if (!node.Children.ContainsKey(ch))
                    {
                        node.Children[ch] = new BoardTrieNode(ch);
                    }
                    Insert(node.Children[ch], charArray, startIndex + 1);
                }
            }
 public BoardTrie()
 {
     Root = new BoardTrieNode(BoardTrieNode.RootChar);
 }