static void Main(string[] args)
        {
            TreeNode root = new TreeNode(5);
            TreeNode n1 = new TreeNode(3);
            TreeNode n2 = new TreeNode(6);
            root.left = n1;
            n1.left = n2;
            //TreeNode n3 = new TreeNode(1);
            //TreeNode n4 = new TreeNode(4);
            //TreeNode n7 = new TreeNode(2);
            //n1.left = n3;
            //n1.right = n4;
            //n3.right = n7;

            Program p = new Program();
            p.Flatten(root);
            Console.WriteLine(root.val);
            Console.ReadKey();
        }
        // return tail?
        private TreeNode FlatTree(TreeNode node)
        {
            //base case - leaf
            if (node.left == null && node.right == null) return node;

            TreeNode rightTail = null;
            if (node.right != null)
                rightTail = FlatTree(node.right);

            TreeNode leftTail = null;
            if (node.left != null)
            {
                leftTail = FlatTree(node.left);
                leftTail.right = node.right;
                node.right = node.left;
                node.left = null;
            }

            return rightTail == null ? leftTail : rightTail;
        }
 public void Flatten(TreeNode root)
 {
     if (root == null) return;
     FlatTree(root);
 }