Here is the link of gist on github.com.
| using System; | |
| using System.Collections.Generic; | |
| using System.Diagnostics; | |
| using System.Linq; | |
| using System.Text; | |
| using System.Threading.Tasks; | |
| namespace _742_closest_leaf_in_a_binary_tree | |
| { | |
| class Program | |
| { | |
| public class TreeNode { | |
| public int val; | |
| public TreeNode left; | |
| public TreeNode right; | |
| public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) { | |
| this.val = val; | |
| this.left = left; | |
| this.right = right; | |
| } | |
| } | |
| static void Main(string[] args) | |
| { | |
| var root = new TreeNode(1); | |
| root.left = new TreeNode(2); | |
| root.right = new TreeNode(3); | |
| root.left.left = new TreeNode(4); | |
| root.left.left.left = new TreeNode(5); | |
| root.left.left.left.left = new TreeNode(6); | |
| var test = new Program(); | |
| var result = test.FindClosestLeaf(root, 2); | |
| Debug.Assert(result == 3); | |
| } | |
| /// <summary> | |
| /// study code | |
| /// https://leetcode.com/problems/closest-leaf-in-a-binary-tree/solutions/3381047/c-bfs-on-graph-solution/ | |
| /// </summary> | |
| /// <param name="root"></param> | |
| /// <param name="k"></param> | |
| /// <returns></returns> | |
| public int FindClosestLeaf(TreeNode root, int k) | |
| { | |
| var adjMap = new Dictionary<int, List<int>>(); | |
| var leaves = new HashSet<int>(); | |
| buildGraph(root, null, adjMap, leaves); | |
| var visited = new HashSet<int>(); | |
| var queue = new LinkedList<int>(); | |
| queue.AddFirst(k); | |
| visited.Add(k); | |
| while (queue.Any()) | |
| { | |
| var node = queue.First.Value; | |
| queue.RemoveFirst(); | |
| if (leaves.Contains(node)) | |
| { | |
| // BFS - first leaf node found | |
| return node; | |
| } | |
| foreach (var next in adjMap[node]) | |
| { | |
| // unvisited node - next | |
| if (visited.Add(next)) | |
| { | |
| queue.AddLast(next); | |
| } | |
| } | |
| } | |
| return -1; | |
| } | |
| /// <summary> | |
| /// Build an undirected graph based on the binary tree | |
| /// All node's values are unique - so the value can be the key to lookup | |
| /// </summary> | |
| /// <param name="node"></param> | |
| /// <param name="parent"></param> | |
| /// <param name="adjDict"></param> | |
| /// <param name="leaves"></param> | |
| void buildGraph(TreeNode node, TreeNode parent, Dictionary<int, List<int>> adjDict, HashSet<int> leaves) | |
| { | |
| if (node == null) | |
| { | |
| return; | |
| } | |
| adjDict[node.val] = new List<int>(); | |
| if (parent != null) | |
| { | |
| // build two directions - parent <-> child | |
| // one direction -> two directions -> undirected graph | |
| adjDict[node.val].Add(parent.val); | |
| adjDict[parent.val].Add(node.val); | |
| } | |
| if (node.left == null && node.right == null) | |
| { | |
| leaves.Add(node.val); | |
| } | |
| buildGraph(node.left, node, adjDict, leaves); | |
| buildGraph(node.right, node, adjDict, leaves); | |
| } | |
| } | |
| } |
No comments:
Post a Comment